首页 > 编程语言 > 详细

算法设计与分析 5.5 真-白给题

时间:2019-12-22 21:05:11      阅读:83      评论:0      收藏:0      [点我收藏+]

★题目描述

给定1-n的一个排列,要求你将它们重排,使得任意两个相邻的数的和为质数。

★输入格式

一个正整数n。n<=20。

★输出格式

输出一行一个1-n的排列,满足相邻的两个数相加为质数。

如果有多组解,输出字典序最小的那一个。

如果无解,输出-1。

★样例输入

2

★样例输出

1 2

★样例输入

3

★样例输出

1 2 3

★提示

★参考代码

/*
优化:
    满足要求的数列必定是一积一偶排列的 
*/

#include<bits/stdc++.h>
using namespace std;
int n;
int res[21];

int isPrime(int num){ 
    if(num==2) return true; //2特殊处理 
    if(num<2 || num%2 == 0) return false; //识别小于2的数和偶数 
    for(int i=3; i*i<=num; i+=2){
        if(num%i==0) return false;
    }
    return true;
}

void dfs(int step){
    if(step==n+1){
        for(int i=1; i<=n; ++i) printf("%d ",res[i]);
        exit(0);
    }
    for(int i=step; i<=n; i+=2){
        swap(res[step], res[i]);
        if(isPrime(res[step]+res[step-1])) dfs(step+1);
        swap(res[step], res[i]);
    }
} 

int main(){
    scanf("%d",&n);
 
    for(int i=1; i<=n; ++i){
        res[i]=i;
    }
    
    for(int i=1; i<=n; i+=2){
        swap(res[1], res[i]);
        dfs(2);
        swap(res[1], res[i]);
    }
    printf("-1\n"); 
    return 0;
}

算法设计与分析 5.5 真-白给题

原文:https://www.cnblogs.com/yejifeng/p/12080880.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!