Prime Ring Problem (DFS练习题)

           K - Prime Ring Problem

 
=================================================================================================================================
题目大意是给出 1~n 个数 第一个数必定是 1 ,使得无论那两个相邻的数相加,都是质数(即大于1的自然数中,除了1和它本身以外不再有其他因数);
打印出所有可能,即直接用dfs 遍历所有可能性;
我的代码思路:
1. 数组范围很小 最大的和不超过40  则可以直接预处理这个范围内的数是否为质数。
2.如何快速判断是否为质数 ,快速的方法 :先判断2之后  3~sqrt(n) 之间所有的奇数 是否存在其约数。
3.用tail数组储存列表。
4.一般dfs的套路 使用book 标记是否使用过,开始遍历。
=================================================================================================================================
代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 int n;
 7 bool prime[40]; 
 8 void Prime()  //预处理1~40之间的数是否为质数
 9 {
10     for(int i = 3;i <= 40;++i)
11     {
12         bool flag = 0;
13         for(int j = 2;j<=sqrt(i);j==2?++j:j+=2)
14           if(i%j==0) {flag = 1;break;}
15         flag==0?prime[i]=1:prime[i]=0; //1即为质数0则否
16     }
17 }
18 int tail[40]; //列表
19 void print()  //打印列表
20 {
21     for(int i =1;i<=n;++i)
22         printf(i==n?"%d\n":"%d ",tail[i]);
23 }
24 bool book[40]; //标记
25 void dfs(int x)
26 {
27     if(x==n)
28        {   //最后再判断最后一个数与第一个数相加是否为质数
29            if(prime[tail[n]+tail[1]]) print(); 
30            return; 
31        }
32     for(int i = 2;i<=n;++i)
33     {
34         if(prime[i+tail[x]]&&book[i]==0)//标准dfs套路↓
35         {
36             tail[x+1] = i;
37             book[i] = 1;
38             dfs(x+1);     
39             book[i] = 0;
40         }
41     }
42 }
43 int main()
44 {
45     int cas = 0;
46     Prime();
47     tail[1] = 1; book[1] = 1;
48     while(~scanf("%d",&n))
49     {
50         memset(book,0,sizeof(book));
51         printf("Case %d:\n",++cas);
52         if(n==1) printf("1\n");
53         else if(n%2==1) ; //如果是奇数,铁定实现不了
54         else dfs(1);
55         putchar('\n');
56     }
57 }

 

posted on 2018-08-01 16:59  短发控丶  阅读(1195)  评论(0编辑  收藏  举报

导航