HDOJ 1016 Prime Ring Problem

  简单的深度优先搜索,但是需要注意尾节点与首节点之和同样必须为素数。

View Code
 1 #include<stdio.h>
2 #include <memory.h>
3 #include <math.h>
4
5 int num;
6 int result[21];
7 bool visited[21];
8 bool prim[40]={0};
9 bool caseFlag;
10 int caseCnt=0;
11 void Prim()
12 {
13 int i;
14 for(int n=1;n<40;n++)
15 {
16 int k=sqrt((double)n);
17 for(i=2;i<=k;i++)
18 if(n%i==0)
19 break;
20 if(i==k+1)
21 {
22 prim[n]=true;
23 }
24 }
25 }
26 void dfs(int prev)
27 {
28 for (int i=2;i<=num;i++)
29 {
30 if(visited[i]||!prim[i+result[prev]]) continue;
31 visited[i]=true;
32 result[prev+1]=i;
33 dfs(prev+1);
34 visited[i]=false;
35 }
36 if(prev==num&&prim[1+result[num]])
37 {
38 if(caseFlag)
39 {
40 printf("Case %d:\n",caseCnt);
41 caseFlag=false;
42 }
43 for (int i=1;i<num;i++)
44 printf("%d ",result[i]);
45 printf("%d",result[num]);
46 printf("\n");
47 }
48 }
49 int main()
50 {
51 //freopen("Prime Ring Problem.txt","r",stdin);
52 Prim();
53 while (scanf("%d",&num)!=EOF)
54 {
55 caseCnt++;
56 caseFlag=true;
57 memset(visited,0,sizeof(visited));
58 result[1]=1;
59 dfs(1);
60 printf("\n");
61 }
62 return 0;
63 }



posted on 2011-10-09 16:53  AdaByron  阅读(158)  评论(0编辑  收藏  举报

导航