Page 194 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 194

for문은 0행부터 7행까지 퀸을 배치합니다. 다음의  a ,  b 는 그림 5-20에 대한 설명입니다.



                    a  0행에 퀸을 배치하는 방법입니다. flag[0]의 값이 1이므로 이 행에는 퀸을 이미 배치했음
                   을 알 수 있습니다. 따라서 여기에는 배치하지 않습니다. 그 결과 점선으로 둘러싼 부분(그림
                   5-18)에 있는 262,144개의 조합이 완전히 생략됩니다. 색칠한 부분은 배치를 건너뜁니다. 다

                   시 말해 set 함수를 재귀 호출하지 않습니다.


                    b  1행에 퀸을 배치하는 방법입니다. flag[1]의 값이 0이므로 이 행에는 퀸을 아직 배치하지

                   않았습니다. 1행에 퀸을 배치합니다(색칠한 부분). 다시 말해 set 함수를 재귀 호출하여 다음 열
                   인 2번째에 퀸을 배치합니다.
                      2행부터 7행까지도 이와 같은 방법을 사용해 퀸을 배치합니다.


                   또 재귀 호출한 set(i + 1) 함수가 끝나면 퀸을 j행에서 제거했기 때문에 flag[j]에 아직 배치하

                   지 않았음을 나타내는 0을 대입합니다. set 함수에서는 퀸을 배치하지 않은 행(flag[j]의 값이 0
                   인 행)에만 퀸을 배치합니다. 이처럼 필요하지 않은 분기를 없애 불필요한 조합을 줄이는 방법
                   을 한정(bounding) 조작이라 하고, 가지 뻗기와 한정 조작을 조합하여 문제를 풀어 가는 방법
                   을 분기 한정법(branching and bounding method)이라고 합니다.




                   8퀸 문제를 푸는 프로그램

                   실습 5-8의 프로그램은 퀸이 행 방향과 열 방향으로 겹쳐지지 않는 조합을 나열(출력)하기만
                   했습니다. 이런 경우는 ‘8퀸 문제를 풀었다.’가 아니라 ‘8룩(Rook) 문제를 풀었다.’라고 말할
                   수 있습니다. 퀸은 대각선 방향으로도 이동할 수 있기 때문에 어떤 대각선에서 보더라도 퀸을
                   1개만 배치하는 한정 조작을 추가해야 합니다.


                      실습 5-9                                             •완성 파일 chap05/eight_queen.c

                     01  /* 8퀸 문제 풀이 */
                     02  #include <stdio.h>
                     03
                     04  int flag_a[8];     /* 각 행에 퀸을 배치했는지 체크하는 배열 */
                     05  int flag_b[15];    /* 대각선 /에 퀸을 배치했는지 체크하는 배열 */
                     06  int flag_c[15];    /* 대각선 \에 퀸을 배치했는지 체크하는 배열 */
                     07  int pos[8];       /* 각 열에서 퀸의 위치 */
                     08





                   194   C 알고리즘
   189   190   191   192   193   194   195   196   197   198   199