1 #include <iostream>
2 #include <stdio.h>
3 using namespace std;
4 int num = 1;
5 bool a[8], b[16], c[16], vis[8][8];
6 //a, b, c 数组标记 列 和 斜线
7 //正斜线上位置 x 和 y 相加为一个常数且每个斜线都不相等
8 //反斜线上位置 x 和 y 相减为一个常数且每个斜线都不相等
9 //所以可以用这个规律来标记每个斜线上是否有皇后
10
11 void read(){
12 cout<<num++<<" *************"<<endl;
13 for(int i = 0; i < 8; ++i){
14 for(int j = 0; j < 8; ++j){
15 if(vis[i][j]) printf("Q ");
16 else printf(". ");
17 }
18 printf("\n");
19 }
20 }
21
22 void dfs(int x){ //x 为行号
23 if(x == 8){
24 read();
25 return ;
26 }
27 for(int i = 0; i < 8; ++i){
28 if(a[i] || b[x+i] || c[x-i+8]) continue;
29 a[i] = b[x+i] = c[x-i+8] = vis[x][i] = true;
30 dfs(x+1);
31 a[i] = b[x+i] = c[x-i+8] = vis[x][i] = false;//一定在搜索下一行前把标记的复原
32 }
33 }
34
35 int main(){
36 dfs(0);
37 return 0;
38 }