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 }