1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 10320 通过数: 3609
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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 ...以下省略
【来源】
i表示行,a[j]=i,表示第i行的第j个数
#include<iostream>
using namespace std;
int a[10001],b[10001],w[10001],m[10001],tot = 0;
int print()
{
tot++;
cout << "No. " << tot << endl;
for(int i = 1; i <= 8; ++i)
{
for(int j = 1; j <= 8; ++j)
{
if(i == a[j])
cout << "1" << " ";
else
cout << "0" << " ";
}
cout << endl;
}
}
int search(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 search(j+1);//摆放下一个皇后
b[i] = 0;
w[i-j+7] = 0;
m[i+j] = 0; //回溯法,收回上一个放出的皇后
}
}
}
int main()
{
//freopen("b.txt","w",stdout);
search(1);
return 0;
}
来源:https://blog.csdn.net/yanyanwenmeng/article/details/100878104