八皇后问题 (递归 搜索)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
using namespace std;
bool d1[100],d2[100],l[100];
int a[100];
int total;
int search(int);
int print();
int main()
{
search(1);//从第一个皇后开始放(很像素数环从第一个开始填,我们都是从简单的开始,从什么地方开始递归很重要)
return 0;
}
int search(int x)//放第x个皇后,或者说是放第x行上的皇后(8个皇后一共8行,一定1行1个)
{
for(int i=1;i<=8;i++)//寻找可以放置的列数
if((!l[i])&&(!d1[i+x])&&(!d2[x-i+7]))//如果第i列没有被放置,且两个对角线没有被占领;
{
a[x]=i;//第x个皇后在第i列
l[i]=1;//占领列数
d1[i+x]=1;//占领对角线
d2[x-i+7]=1;
if(x==8)print();//当放满8个或者说是每一行都有皇后输出
else
search(x+1);//没放完,继续放下一个
l[i]=0;//回溯
d1[x+i]=0;
d2[x-i+7]=0;
}
}
int print()//输出
{
total++;
cout<<"sum="<<total<<endl;
for(int i=1;i<=8;i++)
cout<<setw(4)<<a[i];//注意setw头文件是iomanip;
cout<<endl;
}
//和素数环很像,都是有几个空,然后从第一个开始填,只是能填的条件不一样;