魔性的素数环1~20 自带解释~

可以尝试一下,转到超级多哈哈哈

题目?

素数环定义:

  从12020个数摆成一个环,要求相邻的两个数的和是一个素数。

【算法分析】

非常明显,这是一道回溯的题目。从1开始,每个空位有20种可能,只要填进去的数合法:与前面的数不相同;与左边相邻的数的和是一个素数。第20个数还要判断和第1个数的和是否素数。

【算法流程】

1、数据初始化;   2、递归填数:判断第i个数填入是否合法;
A、如果合法:填数;判断是否到达目标(20个已填完):是,打印结果;不是,递归填下一个;
B、如果不合法:选择下一种可能;

【代码】

#include<iostream>
#include<cmath>
using namespace std;

bool b[21]= {0};
int h=0,a[21]= {0};

bool pd(int x,int y) { //判断和是否为素数;
    int k=2,i=x+y;
    while(k<=sqrt(i) && i%k!=0) k++;
    if(k>sqrt(i)) return 1;//为素数;
    else return 0; //不是素数;
}
int print() { //输出;
    h++;//h为个数;
    cout<<"<"<<h<<">";
    for(int j=1; j<=20; j++) cout<<a[j]<<" ";
    cout<<endl;
}

int search(int t) {
    for(int i=1; i<=20; i++)
        //判断与前一个数是否构成素数及该数是否可用;
        if(pd(a[t-1],i) && (!b[i])) {
        //!b[i]是说b[i]没有被使用过~
            a[t]=i;
            b[i]=1; //将使用过的赋值为1;
            if(t==20) {
                if(pd(a[20],a[1])) print();
            } else search(t+1);
            b[i]=0; //回溯;
        }
}

int main() {
    search(1);
    cout<<h<<endl;
    return 0;
}

如果运气好也是错,那我倒愿意错上加错!

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6603718.html