回溯经典问题之八皇后问题

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 
 4 // using back tracking solve the problem
 5 
 6 int N = 8;                                  
 7 
 8 int a[N]={0}, b[2*N-1]={0}, c[2*N-1]={0};
 9 char queen[N];
10 /*
11 * a[col-1] 记录第 col 列有无皇后, 1 表示有。
12 * b[row+col-2] 记录从左上数第 row+col-1 条斜率为 1 的线上有无皇后。
13 * c[row-col+7] 记录从右上数第 row-col+8 条斜率为 -1 的线上有无皇后。
14 * queen[i] 记录棋盘上第 i 行 皇后所在列
15 */
16 
17 
18 int Num = 0;  //记录解法数
19 int row; 
20 void print()
21 {
22 
23  printf("\n 解法 %d :\n",++Num);
24  int i=0,j=0;
25  for(i=0;i<N;i++)
26  {
27   for(j=0;j<N;j++)
28    if(queen[i]==j)
29     printf("Q\t");
30    else
31     printf(".\t");
32   printf("\n");
33  }
34 }
35 void BackTrack (int row)
36 {
37  if(row >N )
38    print();                                    
39     for (int col=1; col<=N; col++)
40     {
41         if (a[col-1] + b[row+col-2] + c[row-col+N-1] == 0)
42         {
43             a[col-1] = 1;                         
44             b[row+col-2] = 1;
45             c[row-col+N-1] = 1;
46    
47    queen[row-1] = col-1;
48             BackTrack (row + 1);
49 
50             a[col-1] = 0;                          
51             b[row+col-2] = 0;
52             c[row-col+N-1] = 0;
53 
54         }
55     }
56 }
57 
58  
59 
60 
61 int main ()
62 { 
63  BackTrack(1);
64  printf("\n  总共有 %d 解法 \n",Num);
65  return 0;
66 }

 

posted @ 2012-07-26 17:45  Double_win  阅读(195)  评论(0编辑  收藏  举报