回溯1--素数环
Posted 范仁义
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯1--素数环相关的知识,希望对你有一定的参考价值。
回溯2--素数环
一、心得
二、题目及分析
素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
计算1-20这20个数形成的素数环.
三、代码
1 /* 2 /* 3 框架一 4 5 int search(int k){ 6 for(int i=1;i<=算法总数;i++){ 7 if(满足条件){ 8 保存结果 9 if(到目的地) 输出解; 10 else search(k+1); 11 恢复:保存结果之前的状态(回溯一步) 12 } 13 } 14 } 15 16 3 都是在for下的if下的 17 4 保存结果,找下一步,回溯,这三个是一起的 18 5 还有一个到达目的地输出解放在外面就好 19 20 21 search后面的k是轮数 22 23 三个数组: 24 原数据数组 25 标记数组 26 储存结果数组 27 28 29 30 框架二 到目的地的情况要多加1,因为满足了的下一轮就好判断 31 32 */ 33 #include <iostream> 34 #include <cmath> 35 using namespace std; 36 37 38 39 /* 40 三个数组: 41 原数据数组 42 标记数组 43 储存结果数组 44 45 */ 46 bool b[21]={0};//标记数组 47 int total=0; 48 int ans[21]={0};//储存结果数组 49 50 //判断是否为素数,并且加上1 51 bool pd(int x,int y){ 52 int k=2,i=x+y; 53 while(k<=sqrt(i)&&i%k!=0) k++; 54 if(k>sqrt(i)) return true; 55 else return false; 56 } 57 58 //输出结果 59 void print(){ 60 if(total==5) return ; 61 total++; 62 cout<<"<"<<total<<">"<<endl; 63 for(int i=1;i<=20;i++){ 64 cout<<ans[i]<<" "; 65 } 66 cout<<endl; 67 } 68 69 //回溯 70 int search(int t){ 71 if(t==21&&pd(ans[20],ans[1])) print();//这里要多加一个1,因为是下一轮 72 else 73 for(int i=1;i<=20;i++){ 74 if(pd(ans[t-1],i)&&!b[i]){ 75 ans[t]=i,b[i]=1; 76 search(t+1); 77 b[i]=0; 78 } 79 } 80 81 } 82 83 84 85 int main(){ 86 search(1); 87 cout<<total<<endl; 88 return 0; 89 }
以上是关于回溯1--素数环的主要内容,如果未能解决你的问题,请参考以下文章