这是一个很经典的搜索题目;
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。输入无输入。输出按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。
皇后能吃掉同一行,同一列,同一对角线的角色;
所以要把八个皇后放在8*8的棋盘上,保证任意皇后并不能互相吃;在这个问题中有92个解;要求依次输出;可以扩展成n皇后问题,以及各种改版的八皇后问题;
下面是一般八皇后问题深搜的代码;
#include<iostream> using namespace std; int lie[100],a,su=0; bool hang[100],d[100],dd[100]; //用三个bool和一个int数组完成搜索及回溯;具体过程不需讲; void p(void); void s(int); int main() { //cin>>a;可以拓展成n皇后; a=8; s(1); //cout<<su;可以输出解个数; return 0; } void s(int sum)//搜索函数; { int i; for(i=1;i<=a;++i) if((!hang[i])&&!(d[i+sum])&&!(dd[sum-i+a-1])) { lie[sum]=i; hang[i]=1;d[i+sum]=1;dd[sum-i+a-1]=1; if(sum==a) { su++; p(); } else s(sum+1); hang[i]=0;d[i+sum]=0;dd[sum-i+a-1]=0; } } void p(void) { cout<<"No. "<<su<<endl; for(int i=1;i<=a;++i) { for(int j=1;j<=a;++j) if(i==lie[j])//将所有解的矩阵输出,1代表有皇后 cout<<"1 "; else cout<<"0 "; cout<<endl; } }
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
这是noi题库上一个改版的八皇后问题;要求输出指定的皇后串;皇后串的排列为按整数大小
第一个皇后串15863724;
最后一个皇后串84136275;
0 0 1 0 0 0 0 0//这是最后一个字符串的表示
0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0
0 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
1 0 0 0 0 0 0 0
最后一个皇后串表示在第一列第八排有一个皇后、第二排第四排有一个皇后、第三列第一排······第八列第五排有皇后;