hdu 1016

hdu 1016 Prime Ring Problem

http://acm.hdu.edu.cn/showproblem.php?pid=1016

大意:从1到n的n个数组成一个环,任意两个相邻的数之和为素数,环从1开始

 1 /*
 2 hdu 1016 Prime Ring Problem
 3 2013-06-04 20:40:51    Accepted    1016    187MS    244K    1183 B    C++
 4 有点字典树的感觉,父节点与子节点的和为素数
 5 */
 6 
 7 #include <iostream>
 8 #include <string.h>
 9 #include <math.h>
10 #include <stdio.h>
11 using namespace std;
12 bool prim[40];
13 int num[25];
14 bool used[25];
15 //筛法
16 void is_prim()
17 {
18     memset(prim,0,sizeof(prim));
19     prim[0]=prim[1]=1;
20     int sq=sqrt((double)40);
21     for(int i=2;i<sq;i++)
22         for(int j=i*i;j<40;j+=i)
23             prim[j]=1;
24 }
25 void dfs(int root,int n,int t)
26 {
27     //数组从1开始,工n个数,当t>n时,说明n个数已排好序
28     if(t>n&&!prim[num[n]+num[1]])
29     {
30         for(int j=1;j<n;j++)
31             printf("%d ",num[j]);
32         printf("%d\n",num[n]);
33         return;
34     }
35     for(int i=1;i<=n;i++)
36     {
37         if(!prim[root+i]&&!used[i])
38         {
39             num[t]=i;
40             used[i]=1;
41             dfs(i,n,t+1);
42             used[i]=0;
43         }
44 
45     }
46 }
47 int main()
48 {
49     is_prim();
50     int n;
51     int cas=1;
52     while(scanf("%d",&n)!=EOF)
53     {
54         memset(used,0,sizeof(used));
55         printf("Case %d:\n",cas++);
56         num[1]=1;//第一个数一定是1
57         used[1]=1;
58         dfs(1,n,2);
59         used[1]=0;
60         printf("\n");
61 
62     }
63     return 0;
64 }

 

posted on 2013-06-04 20:44  行者1992  阅读(976)  评论(0编辑  收藏  举报