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 }