【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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 ...以下省略
这题比较坑,不是按照正常的顺序输出,所以做了很久,还有就是判断值的问题,要明白这里的a[i]是不用回溯的是因为它选中了就说明是符合条件的,不需要回溯其实这个和全排列差不多,
#include<bits/stdc++.h>
using namespace std;
int a[30];
int b[30];
int c[30];
int d[30];
int flag=0;
void print()
{
flag++;
cout<<"No. "<<flag<<endl;
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 searchh(int i)
{
for(int j=1;j<=8;j++)
{
if((!b[j])&&(!c[i+j])&&(!d[i-j+7]))
{
a[i]=j;
b[j]=1;
c[i+j]=1;
d[i-j+7]=1;
if(i==8) print();
else searchh(i+1);
b[j]=0;
c[i+j]=0;
d[i-j+7]=0;
}
}
}
int main()
{
searchh(1);
return 0;
}