Description
输入一个整数n,输出一个1至n组成的素数环。
素数环指的是任意相邻两数的和均为素数。要求这个素数环的字典序最小。
如果无法得到这样的素数环,输出-1。
输入格式
一个整数n (2<=n<=20)
输出格式
仅一行,满足条件的一个排列,两个数字间用空格分隔。
如果无法得到这样的素数环,输出-1。
输入样例
14
输出样例
1 2 3 4 7 6 13 10 9 14 5 8 11 12
源码:
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int n,flag; //数量n、是否已找到素数环标记flag
int v[21]; //标记数组
int a[21]; //素数环数组
bool isPrime(int n) //判断是否为素数函数
{
if(n==0||n==1)
return false;
int i,lim=sqrt(n);
for(i=2;i<=lim;i++)
if(n%i==0)
return false;
return true;
}
void dfs(int step) //深搜
{
if(step==n+1&&isPrime(a[1]+a[n])) //如果已经找完所有数字,并且最后一个和第一个的和也是素数,说明已找到答案,并且为最佳答案
{
flag=1; //已找到答案标记
for(int i=1;i<=n;i++) //将素数环输出
{
cout<<a[i];
if(i==n)
cout<<endl;
else
cout<<' ';
}
}
else
{
for(int i=2;i<=n;i++) //检查当前step格可以放什么数字
{
if(flag) //如果其他递归已找到答案,则不必继续递归
break;
if(!v[i]&&isPrime(i+a[step-1])) //如果该数字i没有使用过,并且i与上一step的值的和为素数
{
a[step]=i; //当前step格放i
v[i]=1; //使用标记
dfs(step+1); //递归
v[i]=0; //回溯
}
}
}
}
int main()
{
cin>>n;
a[1]=1; //第一格必定为1
dfs(2); //step从第二格开始
if(!flag) //如果没找到答案
cout<<"-1"<<endl; //输出-1
return 0;
}