【解题报告】【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 }

 

posted on 2012-07-21 18:34  coding封神  阅读(118)  评论(0编辑  收藏  举报

导航