题目描述
在 n*n 格的国际象棋上摆放 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同
一列或同一斜线上,如下图(a)所以示
(b)是一个可行解,用序列 2 4 1 3 来表示,第 i 个数表示在第 i 行的相应位置有一个棋子。 这只是 4 皇后问题的一个解。请编一个程序找出 n 皇后的所有解。
输入格式
一行一个整数 n。
输出格式
按题目所说的序列方法输出,解按字典顺序排列。请输出前 3 个解(不足 3 个就全部输出)。最后一行是解的总个数。
样例
样例输入
4
样例输出
2 4 1 3
3 1 4 2
2
数据范围与提示
N <= 20
#include<bits/stdc++.h>
using namespace std;
int w[50],a[25],z[25],n[50],f;
int m;
void dfs(int step){
if(step==f+1){
m++;
if(m<=3){
for(int i=1;i<=f;++i){
cout<<a[i]<<" ";
}
cout<<endl;
}
return ;
}
else{
for(int i=1;i<=f;++i){
if(z[i]==0&&w[step-i+f]==0&&n[step+i]==0){
a[step]=i;
z[i]=1;
w[step-i+f]=1;
n[step+i]=1;
dfs(step+1);
z[i]=0;
w[step-i+f]=0;
n[step+i]=0;
}
}
}
}
int main(){
freopen("B.in","r",stdin);
freopen("B.out","w",stdout);
cin>>f;
dfs(1);
cout<<m;
return 0;
}