原题传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2553
N皇后 由八皇后问题演变而来 据说当年高斯先生用人力算八皇后问题 没错 就是那个小学二年级发明等差数列求和公式的高斯 强如高斯 当初在算这个问题的时候也没有得到正确答案 还好今天我们有计算机
经典dfs问题 由于递归实现dfs比较慢 为了防止超时 可以提前打表
下面是AC代码
#include<stdio.h>
#include<string.h>
int n,count;
int flag[11],map[11],ans[11];
int abs(int m)
{
if(m<0)
return -m;
return m;
}
void dfs(int h)
{
int i,j,t;
if(h>n)
{
count+=1;
return;
}
for(i=1;i<=n;i++)
{
if(!flag[i])
{
map[h]=i;
t=1;
for(j=1;j<=h-1;j++)
{
if(abs(map[h]-map[j])==h-j)
{
t=0;
break;
}
}
if(t)
{
flag[i]=1;
dfs(h+1);
flag[i]=0;
}
}
}
return;
}
int main()
{
int i;
for(i=1;i<=10;i++)
{
n=i;
count=0;
memset(map,0,sizeof(map));
memset(flag,0,sizeof(flag));
dfs(1);
ans[i]=count;
}
while(scanf("%d",&i)!=EOF && i)
{
printf("%d\n",ans[i]);
}
return 0;
}