题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1213
题目描述:
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
No. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
No. 2
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0
...以下省略
1 #include <bits/stdc++.h> 2 using namespace std; 3 int ans[9],sum; //// ans[i]用于记录第i行皇后列号,sum用于记录方案数 4 bool isp(int x1,int y1,int x2,int y2){ 5 return x1==x2||y1==y2||abs(x1-x2)==abs(y1-y2); // 返回true:会互相攻击到;返回false:不会互相攻击到 6 } 7 void prin(){ 8 sum++; 9 cout<<"No."<<sum<<endl; 10 for(int i=1;i<=8;i++){ 11 for(int j=1;j<=8;j++){ 12 cout << (j > 1 ? " " : "") << (j == ans[i]); 13 } 14 cout<<endl; 15 } 16 } 17 void dfs(int id){ 18 if(id>8){ 19 prin(); // 说明前8行已经放好了 20 return ; 21 } 22 for(int i=1;i<=8;i++){ // 尝试在第id行第i列放皇后 23 bool flag=true; // flag用于标识是否能放 24 for(int j=1;j<id;j++){ 25 if(isp(id,i,j,ans[j])){ // (id,i)和(j,ans[j])冲突 26 flag=false; 27 break; 28 } 29 } 30 if(flag){ // 如果循环结束flag仍为true说明i能放 31 ans[id] = i; // 能放就先放上 32 dfs(id+1); // 然后递归进行下一行的放置 33 } 34 } 35 } 36 int main(){ 37 dfs(1); // 从第1行开始放 38 return 0; 39 }