题目描述
在n×n 格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
设计一个解 n 后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入格式:
1 个正整数n
输出格式:
输出计算出的彼此不受攻击的n个皇后的一个放置方案。
输入样例
5
输出样例
1 3 5 2 4
这道题有两个点,题目有些描述不清晰的点是,它的输出是有n个数,而这n个数代表的是从第1行到n行皇后放置在第几列,1 3 5 2 4就代表第一个皇后放在第一行的第一列,第二个皇后放在第二行的第三列,类推。第二个点就是它只要求输出一个放置方案,我提交的时候用递归求出了所有的放置方法,然后AC失败。
后来改了一下就成功了,但是这代码可以用于n皇后输出所有的方案问题,稍加改动就行
dfsQueen(int k)中的k是代表1~k-1行的皇后都已经放置成功的情况放置第k行的皇后。
#include<iostream>
#include<algorithm>
using namespace std;
int Queen[100],n,l=0; //l用来求递归了几次,题目只求一次,那么一次就输出就行
void dfsQueen(int k){
if(k==n&&l==0){ //证明已经摆完 ,输出
for(int i=0;i<n;i++){
cout<<Queen[i]+1<<" ";
}
l++;
return;
}
for(int i=0;i<n;i++){ //每次循环判断n列中没与前面k行中的皇后有相连的情况
int j;
for(j=0;j<k;j++){
if(Queen[j]==i||abs(k-j)==abs(Queen[j]-i)){ //有相连情况直接跳出
break;
}
}
if(j==k){ //如果j等于k则证明当前这一列可以放置皇后,递归该列
Queen[k]=i;
dfsQueen(k+1);
}
}
}
main()
{
cin>>n;
dfsQueen(0);
}