题目描述
如图所示为一个由n个圆圈构成的圆环。将自然数1,2,...,n放入圆圈内,并且要求任意两个相邻的圆圈内的数字之和为素数。请问给你圆圈数,你能给出放置自然数的所有正确方案吗?
注意:圆圈中的数字一定是从1开始的,并且连续不重复。
输入
一行,为整数n(1<n<20),表示圆圈数。
输出
输出所有正确的方案,按字典序从小到大排序。每组输出后输出一个换行。具体输出格式见输出样例。
注意:只能按照顺时针方向放置数字。如果无解,输出-1
样例输入
6
样例输出
1 4 3 2 5 6 1 6 5 2 3 4
提示
来源
#include<bits/stdc++.h>
using namespace std;
int n,a[21];bool v[21];
bool pri(int s){
for(int i=2;i*i<=s;i++){
if(s%i==0){return 0;}
}return 1;}
void dfs(int dep=1){
if(dep==n){
if(pri(a[dep-1]+1)){
for(int i=0;i<n;i++){cout<<a[i]<<" ";}cout<<endl;
}return;
}
for(int i=2;i<=n;i++){
if(v[i]==0&&pri(a[dep-1]+i)){
v[i]=1;a[dep]=i;dfs(dep+1);v[i]=0;
}
}
}
int main(){
int num=0;cin>>n;
if(n%2==0){memset(v,0,sizeof(v));a[0]=v[1]=1;dfs();
}else{cout<<-1;}
return 0;}