#include<bits/stdc++.h>
using namespace std;
int a[11],b[11],c[21],d[21],n;
int tnt;
void sb(int deep)
{
for(int i=1; i<=8; i++)
{
if(!b[i]&&!c[deep+i]&&!d[deep-i+7])
{
a[deep]=i;
b[i]=1;
c[deep+i]=1;
d[deep-i+7]=1;
if(deep==8)
{
tnt++;
}
else
{
sb(deep+1);
}
b[i]=0;
c[deep+i]=0;
d[deep-i+7]=0;
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
cin>>n;
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
a[1]=n;
b[n]=1;
c[1+n]=1;
d[1-n+7]=1;
tnt=0;
sb(2);
cout<<tnt<<endl;
}
}
题目描述
在8*8的棋盘上放置8个皇后,使它们互不攻击,即任意两个皇后不允许处在同一横排。同一纵列,也不允许处在同一与棋盘边框成45o角的斜线上。现在假设第一行的皇后的位置已经确定了,问符合条件的摆法有多少种?
输入
多组测试数据。先输入一个整数T表示组数。 然后是T组数据。每组数据一行,输入一个整数n( 1 <= n <= 8),表示第1行的皇后放的列数
输出
对于每组数据输出一行,值为满足条件摆法的种数。
样例输入 Copy
1 1
样例输出 Copy
4
加油学习原理,代码仅供参考。