美文网首页
7-4 素数环

7-4 素数环

作者: laochonger | 来源:发表于2017-12-13 18:34 被阅读0次

    https://vjudge.net/problem/UVA-524

    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    //const int maxn = 50;
    int a[50] = {0};
    int A[20], vis[20];
    int n;
    
    void Prime(){
        a[0] = a[1] = 1;
        for(int i = 2; i <= 31; i++){
            for(int j = 2; i*j < 31; j++){
                if(a[i*j]) continue;
                a[i * j] = 1;
            }
        }
    } 
    
    //bool isp(int p){
    //  if(!a[p]) return true;
    //  return false;
    //}
    
        void dfs(int cur){
        if(cur == n && !a[A[0] + A[n-1] ]) {  //以数组A来储存数字 设置递归边界, 并测试第一个与最后一个数 
            for(int i = 0; i < n; i++){
                printf("%d ", A[i]);
            }
            printf("\n"); 
        }
        else for(int i = 2 ; i <= n ; i++){//尝试放置每个数i 
            if(!vis[i] && !a[i + A[cur-1]]){//如果i没有用过 并且与前一个数之和为素数 
                A[cur] = i ;
                vis[i] = 1;//设置使用标志 
                dfs(cur + 1);
                vis[i] = 0;//清除标志 
            }
        }
    }
    
    int main(){
        int cnt = 1;
        A[0] = 1;
        //int cur;
        Prime();
        while(scanf("%d", &n) != EOF){
            //cur = 1;
            memset(vis, 0 ,sizeof(vis));
            printf("Case %d:\n" , cnt++);
            dfs(1);
                    printf("\n");
        }
        return 0;
    }
    

    就是一个简单的回溯法 注意1是固定的 所以传入的是数组中的第二个元素

    PE...

    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    //const int maxn = 50;
    int a[50] = {0};
    int A[20], vis[20];
    int n;
    
    void Prime(){
        a[0] = a[1] = 1;
        for(int i = 2; i <= 31; i++){
            for(int j = 2; i*j <= 31; j++){
                if(a[i*j]) continue;
                a[i * j] = 1;
            }
        }
    } 
    
    //bool isp(int p){
    //  if(!a[p]) return true;
    //  return false;
    //}
    
        void dfs(int cur){
        if(cur == n && !a[A[0] + A[n-1] ]) {  //以数组A来储存数字 设置递归边界, 并测试第一个与最后一个数 
            for(int i = 0; i < n; i++){
                 printf("%d%c", A[i], i == n - 1 ? '\n' : ' ');
            }
            //printf("\n"); 
        }
        else for(int i = 2 ; i <= n ; i++){//尝试放置每个数i 
            if(!vis[i] && !a[i + A[cur-1]]){//如果i没有用过 并且与前一个数之和为素数 
                A[cur] = i ;
                vis[i] = 1;//设置使用标志
                dfs(cur + 1);
                vis[i] = 0;//清除标志 
            }
        }
    }
    
    int main(){
        int cnt = 1;
        A[0] = 1;
        //int cur;
        Prime();
        while(scanf("%d", &n) != EOF){
            //cur = 1;
            if(cnt > 1) printf("\n");
            memset(vis, 0 ,sizeof(vis));
            printf("Case %d:\n" , cnt++);
            dfs(1);
            //printf("\n");
        }
        return 0;
    }
    

    PE原因是 除去第一次之外 要再每次输出之后添加\n 而我在尾部添加... 另外 空格也是另一个点

    相关文章

      网友评论

          本文标题:7-4 素数环

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