描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
样例输入
样例输出
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 No. 3 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 No. 4 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 No. 5 0 0 0 0 0 1 0 0 1 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 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 ...以下省略
代码:
#include<bits/stdc++.h>
using namespace std;
int a[100],b[100],w[100],m[100],tot=0;
int print()
{
tot++;
cout<<"No. "<<tot<<endl;
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
if(j==a[i])cout<<1<<" ";
else cout<<0<<" ";
cout<<endl;
}
}
int dfs(int j)
{
for(int i=1;i<=8;i++)//搜索可以放的8个位置
{
if(b[i]==0&&w[i-j+7]==0&&m[i+j]==0)//判断条件是否成立
{
a[j]=i;//记录列
b[i]=1;//占领列,将占领的列记为1
w[i-j+7]=1;
m[i+j]=1;//占领两个对角线
if(j==8)print();//如果放置好,输出答案
else dfs(j+1);//摆放下一个皇后
b[i]=0;
w[i-j+7]=0;
m[i+j]=0;
}
}
}
int main()
{
dfs(1);
return 0;
}