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

★题目描述

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

★输入格式

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

★输出格式

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

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

如果无解,输出-1。

★样例输入

2

★样例输出

1 2

★样例输入

3

★样例输出

1 2 3

★提示

★参考代码

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

#include
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 真-白给题)