描述
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。输出时从整数1开始逆时针排列。n<=16。
样例输入:6
样例输出:
-
1 4 3 2 5 6
-
1 6 5 2 3 4
#include <iostream>
#include <math.h>
using namespace std;
const int N=20;
int n;
int path[N],state[N];
int isPrime(int m){
int i;
for(i=2;i<=sqrt(m);i++){
if(m%i==0){
return 0;
}
}
if(m==1){
return 0;
}
return 1;
}
void dfs(int u){
if(u>n&&isPrime(path[1]+path[n])==1){
for(int i=1;i<=n;i++){
printf("%d ",path[i]);
}
printf("\n");
}else{
for(int i=2;i<=n;i++){
if(state[i]==0&&isPrime(i+path[u-1])==1){
path[u]=i;
state[i]=1;
dfs(u+1);
state[i]=0;
}
}
}
}
int main(void){
cin.tie(0);
cin>>n;
path[1]=1;
dfs(2);
return 0;
}