回溯法求解素数环

来源:互联网 发布:mysql数据库回滚 编辑:程序博客网 时间:2024/05/22 12:13
#include<stdio.h>#include<stdlib.h>#define n 16int 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;}

0 0
原创粉丝点击