在棋盘上放置8个皇后,使得他们不能相互攻击,此时,每个皇后的攻击范围为同行同列和同对角线,要求找出所有解,
回忆之前分析生成排列所用的解答树,我们再把问题简化为四皇后问题,规则不变,写出它的完整解答树
与生成1~n的排列这篇博文中的解答树最大的不同点就是----只有一条或者几条路径可以到达最后一层,而其它的路径在递归时因为条件不满足被回溯了,这也称为回溯法。
本题代码如下:
/*八皇后问题*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=8;
int poi[N]={0};
int tot=0;
int search(int cur){
if(cur==N){
tot++;
printf("第%d个解:\n",tot);
for(int i=0;i<N;i++)printf("(x=%d,y=%d)\n",i,poi[i]);
}
else{
for(int j=0;j<N;j++){
int ok=1;
poi[cur]=j;
for(int k=0;k<cur;k++){
if(poi[cur]==poi[k]||cur-poi[cur]==k-poi[k]||cur+poi[cur]==k+poi[k]){
ok=0;break;
}
}
if(ok)search(cur+1);
}
}
}
int main(){
int i,j;
search(0);
}