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

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

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

代码实现:

超时代码,用的是基本的深搜,能够得出结果,用于后面的打表
#include<stdio.h> #include<string.h> int sum,n,visited[15],flag1[25],flag2[25]; void dfs(int i,int num) { int j; 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--; } } } } int main() { 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); } return 0; }


打表代码:
#include<stdio.h>
int main()
{
   int a[11]={0,1,0,0,2,10,4,40,92,352,724},n;
   while(scanf("%d",&n)!=EOF&&n)
   {
      printf("%d\n",a[n]);
   }
   return 0;
}
 

 

 

posted on 2013-02-25 22:02  后端bug开发工程师  阅读(1146)  评论(0编辑  收藏  举报

导航