有N*N的国际象棋棋盘,要求在上面放N个皇后,要求任意两个皇后不会互杀,有多少种不同的放法?
输入格式
每一个数为T,代表CASE的数量,T<=13
此后,每行一个数N(13>=N>0)
输出格式
每一个CASE,输出对应答案
输入样例
2
4
5
输出样例
2
10
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int b[20],n,ans;// b[i]表示第i个皇后放在第i行第b[i]列
void dfs(int cur)// cur表示第cur行
{
if(cur==n+1)// 找到一种放法
{
ans++;
return ;
}
for(int i=1;i<=n;i++)// 每一行枚举可能的列数
{
int j;
for(j=1;j<cur;j++)// 判断第cur行第i列放一个皇后是否与前面的皇后冲突
{
if(b[j]==i||abs(b[j]-i)==abs(j-cur))
{
break;
}
}
if(j==cur)// 如果不冲突,去下一行寻找皇后
{
b[cur]=i;
dfs(cur+1);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ans=0;
scanf("%d",&n);
dfs(1);
printf("%d\n",ans);
}
return 0;
}