您的位置:首页 > 其它

hdu 2553 N皇后问题(有点坑爹的深搜题dfs)

2013-02-25 22:02 381 查看
题意:就是问任意两个点之间不在同一行、不在同一列、两点的连线不能与正方形的边成45度角总共有多少种方法。

思路:一般的深搜题,但要注意两点的连线不能与正方形的边成45度角,坑爹的是用深搜编出来之后我提交了竟然是超时,后来想想完全可以打表啊!!

代码实现:

超时代码,用的是基本的深搜,能够得出结果,用于后面的打表
#include<stdio.h>
#include<string.h>
intsum,n,visited[15],flag1[25],flag2[25];
voiddfs(inti,intnum)
{
intj;
if(num==n)
sum++;
else
{
for(j=1;j<=n;j++)
{
if(visited[j]==0&&flag1[i+j]==0&&flag2[n-i+1+j]==0)
{
num++;
visited[j]=-1;
flag1[i+j]=-1;
flag2[n-i+1+j]=-1;
dfs(i+1,num);
visited[j]=0;
flag1[i+j]=0;
flag2[n-i+1+j]=0;
num--;
}
}
}
}
intmain()
{
while(scanf("%d",&n)!=EOF&&n)
{
sum=0;
memset(visited,0,sizeof(visited));
memset(flag1,0,sizeof(flag1));
memset(flag2,0,sizeof(flag2));
dfs(1,0);
printf("%d\n",sum);
}
return0;
}

打表代码:

#include<stdio.h>
intmain()
{
inta[11]={0,1,0,0,2,10,4,40,92,352,724},n;
while(scanf("%d",&n)!=EOF&&n)
{
printf("%d\n",a[n]);
}
return0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: