【解题报告】【HDOJ1016】【DFS素数环】Prime Ring Problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
注意:行末没空格,每次测试数据都要多输出一行
1 #include<stdio.h> 2 #include<string.h> 3 int time;//计数器 4 int n;//数字规模 5 int ring[22];//记录环的内容 6 int record[22];//记录数字是否用过 7 int prime[40];//素数表 8 void init();//初始化函数 9 void makePrime();//用筛选法构造素数表 10 void play(int i);//递归函数 11 void print_num();//输出序列 12 int main() 13 { 14 makePrime();//生成素数表 15 time=1;//初始化计数器 16 while(scanf("%d",&n)!=EOF) 17 { 18 init(); 19 printf("Case %d:\n",time++); 20 play(2); 21 printf("\n"); 22 } 23 return 0; 24 } 25 //*****下面为子函数*********** 26 void play(int i)//对于第i个位置 27 { 28 int j; 29 if(i>n) 30 { 31 if(prime[ring[i-1]+1]) print_num();//如果符合 32 return; 33 } 34 else 35 { 36 for(j=2;j<=n;j++)//对于除1外所有数 37 { 38 if(!record[j]) continue; 39 if(prime[(j+ring[i-1])])//该数没用过,且它和上一个被选数字的和是素数 40 { 41 ring[i]=j;//记录进环 42 record[j]=0;//标志它被选了 43 play(i+1);//选择下一个数 44 record[j]=1;//还原 45 } 46 } 47 } 48 } 49 void init()//初始化 50 { 51 int i; 52 memset(ring,0,sizeof(ring));//初始化环 53 ring[1]=1; 54 for(i=2;i<=n;i++) record[i]=1;//初始化记录 55 record[1]=0; 56 } 57 void print_num() 58 { 59 int i; 60 for(i=1;i<=n;i++) 61 { 62 printf("%d",ring[i]); 63 if(i!=n) printf(" "); 64 } 65 printf("\n"); 66 } 67 void makePrime()//用筛选法构造素数表 68 { 69 int i,j; 70 memset(prime,1,sizeof(prime)); 71 prime[0]=0; 72 prime[1]=0; 73 for(i=2;i<=40;i++) 74 { 75 if(prime[i]) 76 { 77 for(j=i+1;j<=40;j++) 78 if(j%i==0) prime[j]=0; 79 } 80 } 81 }