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 }
原文地址:https://www.cnblogs.com/darkboy/p/9402297.html
时间: 2024-10-29 04:34:32