美文网首页
回溯法求解素数环

回溯法求解素数环

作者: Albert_Sun | 来源:发表于2016-03-24 16:16 被阅读1094次
    #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;
    }
    

    相关文章

      网友评论

          本文标题:回溯法求解素数环

          本文链接:https://www.haomeiwen.com/subject/lhurlttx.html