回溯法求解素数环

#include<stdio.h>
#include<stdlib.h>

#define n 16

int num = 0;
int A[n] = {0};
int isp[n*2] = {0};
int vis[n] = {0};

void dfs(int cur){
    int i;

    if(cur == n && isp[A[0] + A[n-1]]){ //递归边界。测试第一个数和最后一个数
        printf("%8d:",++num);
        for(i = 0; i < n; i++){
            printf("%3d", A[i]); //打印方案
        }
        printf("\n");
    }else{
        for(i = 2; i <= n; i++){   //尝试放置每个数i
            if(!vis[i] && isp[i + A[cur-1]]){ //如果i没有用过,并且与前一个数之和为素数
                A[cur] = i;
                vis[i] = 1;  //设置使用标志
                dfs(cur+1);
                vis[i] = 0;   //清除使用标志
            }
        }
    }
}

int is_prime(int un)
{
    int i = 0;

    for(i = 2; i <= un / 2; i++){
        if(un % i == 0){
            return 0;
        }
    }

    return 1;
}

int main()
{
    int i;

    for(i = 2; i <= n*2; i++){
        isp[i] = is_prime(i);
    }

    for(i = 0; i < n; i++){
        A[i] = i + 1;
    }

    dfs(1);

    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 六环教练术能够快速的帮助新员工提升业务技能 1、告知 告知员工该怎么做,说给他听。在这过程中,会遇到一个问题:有些...
    heyelushui520阅读 3,297评论 0 0
  • Prime Ring Problem Problem Description A ring is compose ...
    harvey_dong阅读 4,671评论 0 0
  • 题目要求 现在有一个二维数组,元素为字符。求能否在二维数组中得到一条通路连接的元素为给定的字符串。 题目解析 思路...
    小庄bb阅读 1,670评论 0 0
  • 所谓逆推,即:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件 问题 有一条总共N级的阶梯,一步可以跨...
    小虫巨蟹阅读 4,204评论 1 2
  • 圣杯皇后逆位 隔了两天又再度抽到这张牌。 或许是在提醒我不要耽溺于过去吧, 最重要的是当下、是眼前, 我所做的一切...
    snowbear0114阅读 1,007评论 0 0