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 }

你可能感兴趣的:(HDU)