素数环问题 P154【回溯法】

#include<iostream>
#include<math.h>
using namespace std;

bool isPrime(int x)	//判断整数x是否是素数
{
    int n = (int)sqrt(x);
    for(int i=2; i<=n; i++)
        if(x%i == 0) return false;
    return true;
}

bool isLegal(int k, int n, int a[])	//判断位置k填写是否满足约束条件
{
    for(int i=0; i<k; i++)		//判断即将填写的值是否与填写过的重复
        if(a[i] == a[k]) return false;
    if(!isPrime(a[k]+a[k-1])) return false;	//判断相邻数之和是否为素数
    if(k==n-1 && !isPrime(a[k]+a[0])) return false;	//判断第一个和最后一个之和是否为素数
    return true;
}

void primeCircle(int n)
{
    int a[n];	//用数组a[]来存储素数环
    for(int i=0; i<n; i++)	//将数组所有元素都初始化为0
        a[i] = 0;

    a[0] = 1;
    int k = 1;
    while(k>=1)
    {
        a[k] = a[k]+1;
        while(a[k]<=n)
        {
            if(isLegal(k,n,a)) break;	//位置k可以填写整数a[k]
            else a[k] = a[k]+1;	//试探下一个数
        }

        if(a[k]<=n && k==n-1)	//求解完毕,输出素数环
        {
            for(int i=0; i<n; i++)
                cout<<a[i]<<" ";
            cout<<endl;
            return;
        }

        if(a[k]<=n && k<n-1) k++;	//填写下一个
        else a[k--] = 0;	//回溯
    }
}

int main()
{
    primeCircle(20);
    return 0;
}




todo debug  递归写法



全部评论

相关推荐

02-14 12:40
门头沟学院 Java
程序员花海:1.面试要求必须Java笔试不一定 2.难度对等秋招 远超于日常实习是因为同一批次且转正很多 竞争压力大 3.第一个加点指标,上线了就把接口性能加上去 使用本地缓存这个不算亮点 只是技术选型,要把为什么采用这个和背后的思考写出来而不是单纯堆叠技术没意义 4.八股要一直看 很容易忘记 5.拼团交易这个老问题 堆积技术 另外建议你把奖项合并到教育背景 没必要拆出来放最后
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务