素数环问题 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  递归写法



全部评论

相关推荐

12-13 14:51
已编辑
井冈山大学 算法工程师
龙虾x:算法比你强的没有你美,比你美的…..算了已经没有比你美的了
工作两年想退休了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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