1213:八皇后问题
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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 ...以下省略
解题分析:关键在于斜线还有是否访问过,正斜与反斜角的特点
#include<bits/stdc++.h>
using namespace std;
int a[10001],b[10001],w[10001],m[10001],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 search(int j)
{
for(int i=1 ;i<=8;++i)
{
if(b[i]==0&&w[i-j+7]==0&&m[i+j]==0)
{
a[j]=i;
b[i]=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()
{
search(1);
return 0;
}
记住限制条件是该列有没访问过,还有斜角两个方向。
go