回溯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--素数环的主要内容,如果未能解决你的问题,请参考以下文章

搜索与回溯 - 素数环

如何用Python编写一个素数环?

素数环 南阳acm488(回溯法)

素数环(dfs+回溯)

noj算法 素数环 回溯法

UVA - 524 Prime Ring Problem(素数环)(回溯法)