描述
在 n×n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 后问题等价于在 n×n 格的棋盘上放置 n 个皇后,任何两个皇后不放在同一行或同一列或同一斜线上。
设计一个解 n 皇后问题的队列式分支限界法,计算在 n×n 个方格上放置彼此不受攻击的 n 个皇后的一个放置方案。
注意,本问题的答案可能是不唯一的。如,当 n=5 时,至少有 3 个解:
输入描述
一个正整数 n (4<n≤22)
输出描述
彼此不受攻击的 n 个皇后的一个放置方案。
本题测试数据保证有解。
用例输入 1
5
用例输出 1
1 3 5 2 4
#include<iostream>
using namespace std;
int n,x[25],sum;
inline int Place(int t){
for(int i=1;i<t;i++)
if((abs(t-i)==abs(x[i]-x[t]))||(x[i]==x[t]))
return false;
return true;
}
void Backtrack(int t,bool &firstsolution){
if(t>n){
sum++;
for(int i=1;i<=n;i++)
printf(" %d",x[i]);
firstsolution=true;
}else{
for(int i=1;i<=n;i++){
x[t]=i;
if(Place(t)&&!firstsolution){
Backtrack(t+1,firstsolution);
}
if(firstsolution) break;
}
}
}
int main(){
while(cin>>n){
sum=0;
bool firstsolution=false;
Backtrack(1,firstsolution);
}
}