Guest

Untitled

By: a guest on Aug 16th, 2011  |  syntax: C  |  size: 1.70 KB  |  hits: 84  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1.  
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define MAXCANDIDATES 100
  5. #define NMAX 100
  6.  
  7. typedef int data;
  8. enum {FALSE, TRUE};
  9.  
  10. bool finished;
  11. int  solution_count = 0;
  12.  
  13. int is_a_solution(int a[], int k, int n)
  14. {
  15.         return (k==n);
  16. }
  17.  
  18. void construct_candidates(int a[], int k, int n, int c[], int* ncandidates)
  19. {
  20.           int i, j;            // 카운터 //
  21.         bool legal_move;   // 이동 가능 여부 //
  22.  
  23.         *ncandidates = 0;
  24.                 // 열을 조사
  25.         for(i=1; i<=n; i++)
  26.         {
  27.                         legal_move = true;
  28.                         // 행을 조사
  29.                         for(j=1; j<k; j++)
  30.                         {
  31.                                 if( abs( (k) -j ) == abs( i - a[j] ) || i == a[j] ) // 대각선 방향 or 같은 열
  32.                                 {
  33.                                         legal_move = false;
  34.                                         break;
  35.                                 }
  36.                         }
  37.                         if( legal_move == true )
  38.                         {
  39.                                 c[*ncandidates] = i;
  40.                                 *ncandidates = *ncandidates + 1;
  41.                         }
  42.                 }
  43. }
  44.  
  45. void process_solution(int a[], int k, int n)
  46. {
  47.         solution_count ++;
  48.  
  49.         printf("\n");
  50.         for( int i=1 ; i<=n ; i++ )
  51.         {
  52.                 for( int j=1 ; j<=n ; j++ )
  53.                 {
  54.                         if( a[j] == i)
  55.                                 printf("Q");
  56.                         else
  57.                                 printf(".");
  58.                 }
  59.                 printf("\n");
  60.         }
  61.         printf("\n");
  62. }
  63.  
  64. void backtrack(int a[], int k, data input)
  65. {
  66.         int c[MAXCANDIDATES] = {0,};
  67.         int ncandidates=0;
  68.         int i=0;
  69.  
  70.         if( is_a_solution(a, k, input) )
  71.         {
  72.                 process_solution(a, k, input);
  73.         }
  74.         else
  75.         {
  76.                 k++;
  77.                 construct_candidates(a, k, input, c, &ncandidates);
  78.                 for( i=0 ; i<ncandidates ; i++)
  79.                 {
  80.                         a[k] = c[i];
  81.                         backtrack(a, k, input);
  82.                         if( finished ) return;  // 일찍 종료함
  83.                 }
  84.         }
  85. }
  86.  
  87. void generate_subsets(int n)
  88. {
  89.         int a[NMAX];
  90.         solution_count = 0;
  91.         backtrack(a, 0, n);
  92.         printf("n = %d solution_count = %d\n", n, solution_count);
  93. }
  94.  
  95. int main(void)
  96. {
  97.         generate_subsets(4);
  98.  
  99.         return 0;
  100. }