7-4 素数环

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 而我在尾部添加... 另外 空格也是另一个点

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,477评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,982评论 19 139
  • 我喜欢的,不喜欢的,对你来说都不重要,那么你对于我来说,也不重要。 我经历的不多 ...
    尘肜贞阅读 384评论 -1 7
  • 本文转自漂移板之家 漂移板在中国发展至今,衍生出了各种形式的组织,从地区俱乐部到滑手团体到品牌团体,但在圈子之内的...
    JCSKATE漂移板平台阅读 472评论 0 0
  • 继续说《大学》,康诰曰:“作新民。"这也是《尚书.周书》之《康诰》文中的一句话。原句是:亦惟助王宅天命,作新民。也...
    莲连阅读 7,822评论 0 3