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

★题目描述

给定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;
}

posted on 2019-12-22 20:17  yejifeng  阅读(797)  评论(0编辑  收藏  举报

导航