八皇后问题 (递归 搜索)

八皇后问题:要在国际象棋棋盘8*8中放八个皇后,使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。)
 /*分析:每一列,每一行,每一个对角线只能放一个皇后,判断对角线是否能放的条件是两个皇后横纵坐标的和或者是差不能相等,若相等,则在一个对角线,不能放置,每放一个皇后,都要占领他所在的行,列,对角线*/
代码如下:

#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;
}

//和素数环很像,都是有几个空,然后从第一个开始填,只是能填的条件不一样;

posted @ 2017-03-23 11:56  ANhour  阅读(562)  评论(0编辑  收藏  举报