hdu 1016 回溯法(深度优先搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
代码示例:
1 #include "stdio.h" 2 #include "string.h" 3 4 #define N 100 5 int n,a[100],t; 6 int mark[25],ans[25]; 7 8 void prime(); 9 void DFS(int k); 10 int prime_t(int k); 11 12 int main() 13 { 14 int p=1; 15 prime(); 16 while(scanf("%d",&n)!=-1) 17 { 18 printf("Case %d:\n",p++); 19 memset(mark,0,sizeof(mark)); 20 t=2; 21 mark[1]=1; 22 DFS(1); 23 printf("\n"); 24 } 25 return 0; 26 } 27 28 void DFS(int k) //回溯法(深度优先搜索) 29 { 30 int i,j; 31 if(t==n+1 && prime_t(k+1)==1) 32 { 33 printf("1"); 34 for(i=2;i<=n;i++) 35 printf(" %d",ans[i]); 36 printf("\n"); 37 } 38 for(j=1;j<=n;j++) 39 { 40 if(mark[j]==0 && prime_t(k+j)==1 && j!=k) 41 { 42 mark[j]=1; 43 ans[t++]=j; 44 DFS(j); 45 t--; 46 mark[j]=0; 47 } 48 } 49 } 50 51 void prime() //打印素数 52 { 53 int i,j,k=0; 54 int b[100]; 55 memset(b,0,sizeof(b)); 56 for(i=2;i<100;i++) 57 { 58 if(b[i]==0) 59 { 60 a[k++]=i; 61 for(j=i;j<100;j+=i) 62 b[j]=1; 63 } 64 } 65 } 66 67 int prime_t(int k) //判定素数 68 { 69 int i; 70 for(i=0;i<20;i++) 71 if(k==a[i]) 72 return 1; 73 return 0; 74 }