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(" "); 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 }