#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=10+5;
int m[maxn],res[maxn];
bool hash[maxn];
int ans,n;
void DFS(int k)
{
if(k==n+1)
{
ans++;
return ;
}
for(int i=1;i<=n;i++)
if(!hash[i])//不能和以前的放在同一行
{
m[k]=i;//第k列第j行放置一颗棋子
int flag=1;
for(int j=1;j<k;j++)//对角线上不能有棋子
if(abs(m[k]-m[j])==abs(k-j)) flag=0;
if(flag)
{
hash[i]=1;
DFS(k+1);
hash[i]=0;
}
}
return ;
}
int main()
{
for(int i=1;i<=10;i++)
{
ans=0;
n=i;
memset(m,0,sizeof(m));
memset(hash,0,sizeof(hash));
DFS(1);
res[i]=ans;
}
while(~scanf("%d",&n)&&n)
printf("%d\n",res[n]);
return 0;
}
HDU 2553 N皇后问题(深搜)
最新推荐文章于 2021-01-31 11:15:50 发布