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 ...以下省略
提示
此题可使用函数递归调用的方法求解。
来源
计算概论05
代码演示:
#include<bits/stdc++.h>
using namespace std;
int t=0,a[10],b[10],c[20],d[20],n,x;
void print()//输出函数
{
t++;//摆法数量+1
cout<<"No. "<<t<<endl;//输出格式,注意No.的后面有一个空格
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
if(a[j]==i)//当列等于保存的
cout<<"1 ";
else
cout<<"0 ";
cout<<endl;
}
}
void dfs(int i)//列号,同时也是第i个皇后
{
if(i>8)//当8个皇后排列完毕
{
print();//调用输出函数
}
else//否则还没有排列完毕
for(int j=1;j<=8;j++)//枚举出一列的8个位置(行)
{
if(b[j]==0 && c[i+j]==0 && d[i-j+7]==0)//判断是否合法
//同一行、同一列、同一个对角线均不被占领
{
a[i]=j;//保存行号
b[j]=1,c[i+j]=1,d[i-j+7]=1;//宣布被占领
dfs(i+1);//递归调用皇后
b[j]=0,c[i+j]=0,d[i-j+7]=0;//取消占领(回溯)
}
}
}
int main()
{
dfs(1);//第1行的第一个皇后
}
/*注意
1.八皇后问题是第一个皇后固定同一列,而八皇后是第一个皇后
固定同一行,答案不一样
2.输出格式要注意,较为苛刻
3.保存对角线要注意 :数组的下标不能为负数,所以要保证下标在极端
条件下也不为负数
*/