HDU 2553 N皇后问题(DFS+打表)

题目链接

数据小,DFS完,打表。1Y。直接搞会超时,预处理出来会AC。

造表代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 30
 4 int k[12];
 5 int p[N][N],r[N],c[N],sr[N],sc[N];
 6 int z,n;
 7 void dfs(int x,int y,int step)
 8 {
 9     int t,i,j;
10     if(step == n)
11     {
12         z ++;
13         return ;
14     }
15     if(x >= step + 2)
16     return ;
17     for(i = x; i <= n; i ++)
18         for(j = y; j <= n; j ++)
19         {
20             t = i-j+10;
21             if(!r[i]&&!c[j]&&!sr[i+j]&&!sc[t])
22             {
23                 r[i] = 1;
24                 c[j] = 1;
25                 sr[i+j] = 1;
26                 sc[t] = 1;
27                 dfs(i+1,1,step+1);
28                 r[i] = 0;
29                 c[j] = 0;
30                 sr[i+j] = 0;
31                 sc[t] = 0;
32             }
33         }
34     return ;
35 }
36 int main()
37 {
38      int i;
39     for(i = 1;i <= 10;i ++)
40     {
41         n = i;
42         memset(p,0,sizeof(p));
43         memset(r,0,sizeof(r));
44         memset(c,0,sizeof(c));
45         memset(sr,0,sizeof(sr));
46         memset(sc,0,sizeof(sc));
47         if(!n) break;
48         z = 0;
49         dfs(1,1,0);
50         k[i] = z;
51     }
52   while(scanf("%d",&i)!=EOF)
53    {
54        if(!i) break;
55        printf("%d\n",k[i]);
56    }
57     return 0;
58 }

打表代码

 1 #include <stdio.h>//打表
 2 int main()
 3 {
 4    int p[12]={0,1,0,0,2,10,4,40,92,352,724};
 5    int a;
 6    while(scanf("%d",&a)!=EOF)
 7    {
 8        if(!a) break;
 9        printf("%d\n",p[a]);
10    }
11    return 0;
12 }
posted @ 2012-07-11 21:21  Naix_x  阅读(223)  评论(0)    收藏  举报