#include <iostream>
#include<math.h>
#include<string.h>
using namespace std;
int x[15],k;
int ans[15];
bool place(int k)
{
int i=1;
while(i<k)
{
if((x[i]==x[k])||(abs(x[i]-x[k])==abs(i-k)))
return false;
i++;
}
return true;
}
void drf()
{
for(int j=0;j<=10;j++)//列举n从1到10所有棋盘的情况
{
memset(x,0,sizeof(x));
ans[j]=0;//计数
k=1;
while(k>0)
{
x[k]=x[k]+1;//第k个皇后从放置第一列开始试
while((x[k]<=j)&&(!place(k)))//穷举第k个皇后的所有列位置
x[k]=x[k]+1;
if(x[k]<=j)
{
if(k==j)
ans[j]++;
else
{
k++;
x[k]=0;//开始搜寻下一个
}
}
else
{
k--;
}
}
}
}
int main()
{
int n;
drf();
while(scanf("%d",&n)&&n)
printf("%d\n",ans[n]);
return 0;
}
杭州ACM2553题 皇后问题 (必AC及易错点)
最新推荐文章于 2021-11-14 13:46:22 发布