1700:八皇后问题
总时间限制:
10000ms
内存限制:
65536kB
描述
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
输入
无输入。
输出
按给定顺序和格式输出所有八皇后问题的解(见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 No. 6 0 0 0 1 0 0 0 0 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 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 No. 7 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 No. 8 0 0 1 0 0 0 0 0 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 No. 9 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 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 0 0 1 0 0 0 1 0 0 0 0 0 ...以下省略
提示
此题可使用函数递归调用的方法求解。
核心代码
注意:列优先
void dfs(int l)//l表示皇后所在的列
{
for(int i=1;i<=8;i++)//放置8个皇后
{
if(f1[i]==0&&f2[i-l+8]==0&&f3[i+l]==0)
//f1判断不在同一行,f2判断不在反对角线上,f3判断不在正对角线上
{
f1[i]=1;
f2[i-l+8]=1;
f3[i+l]=1;
a[i][l]=1;//标记数组
dfs(l+1);//判断下一列
f1[i]=0;
f2[i-l+8]=0;
f3[i+l]=0;
a[i][l]=0;//清空数组
}
}
}
输出
注意输出格式
if(l==9)//判断完8行输出
{
cout<<"No. "<<s<<endl;
s++;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return;
}
AC代码
#include <iostream>
using namespace std;
int a[10][10],f1[10],f2[20],f3[20],s=1;
void dfs(int l)
{
if(l==9)
{
cout<<"No. "<<s<<endl;
s++;
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return;
}
for(int i=1;i<=8;i++)
{
if(f1[i]==0&&f2[i-l+8]==0&&f3[i+l]==0)
{
f1[i]=1;
f2[i-l+8]=1;
f3[i+l]=1;
a[i][l]=1;
dfs(l+1);
f1[i]=0;
f2[i-l+8]=0;
f3[i+l]=0;
a[i][l]=0;
}
}
}
int main()
{
dfs(1);
return 0;
}