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 }