HDU 1016 Prime Ring Problem(DFS)

 题目链接

 这个题应该有别的方法吧,DFS参考解题报告,开始的时候不太明白如何在搜过之后如何把状态回溯,看了解题报告后,看到后恍然大悟啊。。。只要加上一个语句就完成了。

 这个程序好慢啊,250ms,最近学习搜索,争取今天做出独立做出一个的DFS。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[21],o[21],k[40];
 4 int n;
 5 void dfs(int num,int step)
 6 {
 7     int i;
 8     p[step] = num ;
 9     o[num] = 1;
10     if(step == n)
11     {
12         if(k[num+1] == 1)
13         {
14             for(i = 1;i <= n;i ++)
15             {
16                 if(i != n)
17                 printf("%d ",p[i]);
18                 else
19                 printf("%d\n",p[i]);
20             }
21         }
22         return ;
23     }
24     if(num % 2 == 0)
25     {
26         for(i = 3;i <= n;i += 2)
27         {
28             if(k[i+num]==1&&o[i]==0)
29             {
30                 dfs(i,step+1);
31                 o[i] = 0;//回溯状态
32             }
33         }
34     }
35     else
36     {
37         for(i = 2;i <= n;i += 2)
38         {
39             if(k[i+num]==1&&o[i]==0)
40             {
41                 dfs(i,step+1);
42                 o[i] = 0;//回溯状态
43             }
44         }
45     }
46 }
47 int main()
48 {
49     int i,a;
50     int su[14] = {2,3,5,7,11,13,17,19,23,29,31,37};
51     a = 0;
52     for(i = 0;i <= 13;i ++)
53     k[su[i]] = 1;
54     while(scanf("%d",&n)!=EOF)
55     {
56         a ++;
57         printf("Case %d:\n",a);
58         memset(o,0,sizeof(o));
59         memset(p,0,sizeof(p));
60         dfs(1,1);
61         printf("\n");
62     }
63 }

 

posted @ 2012-05-30 14:52  Naix_x  阅读(149)  评论(0编辑  收藏  举报