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

가지 뻗기

                   여기에서는 188쪽의 그림 5-18처럼 가지를 뻗으며 모든 조합을 나열하는 프로그램을 만들
                   어 보겠습니다.
                      지금은 조합만 나열하고, 8퀸 문제는 조합을 나열한 다음에 해결하겠습니다.


                   배열 pos는 퀸의 배치를 나타냅니다. i열에 놓인 퀸의                  i열에 놓인 퀸의 위치가 j행이면 pos[i]에 j를
                                                                    대입합니다.
                   위치가 j행이면 pos[i]의 값을 j로 합니다(그림 5-19).
                   예를 들어, pos[0]의 값이 0이면 ‘0열의 퀸이 0행에 배                       0  1  2  3  4  5  6  7
                                                                          0 ●
                   치된 상태’를 의미합니다. pos[1]의 값 4는 ‘1열의 퀸                     1          ●
                                                                          2       ●
                   이 4행에 배치된 상태’를 의미합니다.                                  3            ●
                                                                          4  ●
                   이때 set 함수는 pos[i]에 0부터 7까지의 값을 순서대                     5     ●
                                                                          6         ●
                   로 대입하여 ‘i열에 퀸을 1개만 배치하는 8가지 조합을                        7    ●
                   만드는 재귀 함수’입니다. 매개변수 i가 이 퀸을 배치할

                   열입니다. 이 함수는 가장 먼저 main 함수에서 다음과                    0   4   7   5   2   6   1   3
                                                                       0   1   2   3   4   5   6   7
                   같이 호출합니다.                                          [그림 5-19] 퀸의 배치를 나타내는 배열


                     set(0);



                   호출된 set 함수는 매개변수 i에 0을 전달받습니다. 그리고 0열에 1개의 퀸을 배치하는 8가지

                   조합을 for문에 의해 나열합니다(그림 5-16). j 값을 0부터 7까지 1씩 증가하며 다음과 같이 재
                   귀 호출을 합니다.


                     set(i + 1);



                   set(i + 1)에 의해 앞에서 했던 작업을 다음 열인 1열에서 수행합니다. 이렇게 재귀 호출을 반
                   복하다가 i가 7이 되면 8개의 퀸이 모두 배치됩니다. 그러면 퀸을 더 배치할 필요가 없으므로

                   print 함수를 호출하여 퀸이 배치된 위치를 출력합니다. 출력하는 값은 pos의 배열 요솟값입
                   니다. 이렇게 프로그램을 실행하면 그림 5-18에서 볼 수 있었던 16,777,216개의 모든 조합
                   이 나열됩니다.











                   190   C 알고리즘
   185   186   187   188   189   190   191   192   193   194   195