1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数:52338 通过数: 20002
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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
...以下省略
//1213
#include <bits/stdc++.h>
using namespace std;
bool flag[30];//列标记数组
bool ri[30];//左对角线标记数组
bool le[30];//右对角线标记数组
bool ans[30][30];//棋盘规划数组
int cont=0;//记录方案数
void out()//输出函数
{
cont++;
cout << "No. " << cont << endl;//输出方案数
for (int i=0;i<8;i++)
{
for (int j=0;j<8;j++)
{
cout << ans[j][i] << " ";//注意先输出列在输出行
}
cout << endl;
}
}
void dfs(int step)//步数 记录横坐标
{
for (int i=0;i<8;i++)//循环列 纵坐标
{
if (!flag[i] && !ri[i-step+8] && !le[step+i])
//列上无皇后 右对角线上无皇后 左对角线上无皇后
{
flag[i]=true;
ri[i-step+8]=true;
le[step+i]=true;//设为已走过
ans[step][i] =true;//摆放
if (step==7)
{
out();
}
else
{
dfs(step+1);//递归
}
flag[i]=false;
ri[i-step+8]=false;
le[step+i]=false;
ans[step][i] =false;//回溯
}
}
return ;
}
int main()
{
dfs(0);//步数初始化0
return 0;
}
* 一定要注意先输出列在输出行!!!!!