1 做法:第一步随便放一个棋子,然后找安全位置放第二个棋子,然后放好后再找安全地放第三个x棋子,以此类推
2 详细解释:https://www.bilibili.com/video/av76265320?from=search&seid=10595269197283770223
3 #include<stdio.h>
4
5 int count = 0;
6 int notdanger(int row, int j, int(*chess)[8])
7 {
8 int i,k;
9 int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
10
11 for(i=0; i<8; i++) //判断列
12 {
13 if( *(*(chess+i)+j) != 0 )
14 {
15 flag1 = 1;
16 break;
17 }
18 }
19
20 for(i=row,k=j; i>=0 && k<8; i--,k++)//判断右上方
21 {
22 if( *(*(chess+i)+k) != 0 )
23 {
24 flag2 = 1;
25 break;
26 }
27 }
28
29 for(i=row,k=j; i<8 && k>=0; i++,k--)//判断左下方
30 {
31 if( *(*(chess+i)+k) != 0 )
32 {
33 flag3 = 1;
34 break;
35 }
36 }
37
38 for(i=row,k=j; i<8 && k<8; i++,k++)//判断右下方
39 {
40 if( *(*(chess+i)+k) != 0 )
41 {
42 flag4 = 1;
43 break;
44 }
45 }
46
47 for(i=row,k=j; i>=0 && k>=0; i--,k--)//判断左上方
48 {
49 if( *(*(chess+i)+k) != 0 )
50 {
51 flag5 = 1;
52 break;
53 }
54 }
55
56 if(flag1 || flag2 || flag3 || flag4 || flag5)
57 {
58 return 0;
59 }
60 else
61 {
62 return 1;
63 }
64 }
65 //row表示起始行
66 //n表示总列数
67 //(*chess)[8]表示指向每一行的指针
68 void EightQueen(int row, int n, int(*chess)[8])
69 {
70 int i,j,k;
71 int chess2[8][8];
72
73 for(i=0; i<8; i++)
74 {
75 for(j=0; j<8; j++)
76 {
77 chess2[i][j] = chess[i][j];
78 }
79 }
80
81 if(row == 8)
82 {
83 printf("这是第 %d 种\n",count+1);
84 for(i=0; i<8; i++)
85 {
86 for(j=0; j<8; j++)
87 {
88 printf("%d ",*(*(chess2+i)+j));
89 }
90 printf("\n");
91 }
92 printf("\n");
93 count++;
94 }
95 else
96 {
97 for(k=0; k<n; k++) //判断此行每一个位置 八个位置都尝试一遍
98 {
99 if(notdanger(row,k,chess))
100 {
101 for(i=0; i<8; i++) //回溯
102 {
103 *(*(chess2+row)+i) = 0;
104 }
105 *(*(chess2+row)+k) = 1;
106
107 EightQueen(row+1,n,chess2); //一行放完再放下一行
108 }
109
110 }
111 }
112 }
113 int main(void)
114 {
115 int chess[8][8];
116 int i,j;
117
118 for(i=0; i<8; i++)
119 {
120 for(j=0; j<8; j++)
121 {
122 chess[i][j] = 0;
123 }
124 }
125
126 EightQueen(0,8,chess);
127 printf("\n一共有 %d 中摆法\n",count);
128 return 0;
129 }