美文网首页
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