描述 正整数n表示有n个数,分别是正整数1~n,然后把这n个数组成一个圈,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个圈应恰好输出一次。n < = 16
输入描述 输入整数n。
输出描述 按要求输出。
用例输入
6
用例输出
1 4 3 2 5 6
1 6 5 2 3 4
具体思路:
1 2 3 4 5(4+5=9,不行,回退)
1 2 3 5(3+5=8,不行,回退)
1 2 3 6(3+6=9,不行,回退)
1 2 4(2+4=6,不行,回退)
1 2 5 3(5+3=8,不行,回退)
1 2 5 4(5+4=9,不行,回退)
1 2 5 6 3(6+3=9,不行,回退)
1 2 5 6 4(6+4=10,不行,回退)
1 2 6(2+6=8,不行,回退)
1 3(1+3=4,不行,回退)
1 4 2(4+2=6,不行,回退)
1 4 3 2 5 6 得解。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,sum;
int s[20];
int vis[20];
bool ss(long long e){//判断素数
if(e < 2)return false;
for(int i=2;i<=e/i;i++){
if(e%i==0)return false;
}
return true;
}
void dfs(int len){
if(len==n+1){
if(!ss(s[1]+s[n]))return;//只需判断头加尾是否是素数即可
for(int i=1;i<=n;i++){
cout<<s[i]<<" ";
}
cout<<endl;
return;
}
for(int i=2;i<=n;i++){
if(!vis[i]&&ss(s[len-1]+i)){//这里判断相邻位置是否符合条件
vis[i]=1;
s[len]=i;
dfs(len+1);
vis[i]=0;
}
}
}
int main(){
cin>>n;
s[1]=1;
dfs(2);//因为1已经固定了,所以起点从2开始
return 0;
}