Description
有N*N的国际象棋棋盘,要求在上面放N个皇后,要求任意两个皇后不会互杀,有多少种不同的放法?
输入格式
每一个数为T,代表CASE的数量,T<=13 此后,每行一个数N(13>=N>0)
输出格式
每一个CASE,输出对应答案
输入样例
2 4 5
输出样例
2 10
分析:
枚举每一行皇后所在位置并对其进行剪枝即可。
#include<iostream>
using namespace std;
int n,cnt;
bool col[20],dg[20],udg[20];
void dfs(int u){
if(u==n+1){
++cnt;
return;
}else{
for(int i=1;i<=n;++i){
if(!col[i]&&!dg[u-i+n]&&!udg[u+i]){
col[i]=dg[u-i+n]=udg[u+i]=true;
dfs(u+1);
col[i]=dg[u-i+n]=udg[u+i]=false;
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
cnt=0;
dfs(1);
cout<<cnt<<endl;
}
return 0;
}