单点时限: 4.0 sec
内存限制: 256 MB
一个由自然数 () 素数环就是如下图所示,环上任意两个节点上数值之和为素数。
1
/
4 2
\ /
3
输入格式
输入只有一个数 ,表示你需要建立一个 的素数环。
输出格式
按照字典序输出每一种情况。我们约定顺时针为正向,且第一个元素必须是 ,参见 Sample。
样例
input
6
output
1 4 3 2 5 6
1 6 5 2 3 4
/*
思路:dfs全排列加判断
*/
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
bool visit[19]= {false};
vector<int>v;
int n;
int prim[37]= {0};
void dfs(int index) {
if(index==n) {
if(prim[v[index-1]+v[0]]) {
for(int i = 0; i < n; i++)
cout<<v[i]<<" ";
cout<<endl;
}
return ;
}
for(int i = 2; i <= n; i++) {
if(visit[i]==false&&prim[v[v.size()-1]+i]) {
visit[i]=true;
v.push_back(i);
dfs(index+1);
v.pop_back();
visit[i]=false;
}
}
}
int main() {
cin>>n;
prim[2]=prim[3]=prim[5]=prim[7]=prim[11]=prim[13]=prim[17]=prim[19]=prim[23]=prim[29]=prim[31]=1;
v.push_back(1);
dfs(1);
// cout<<"\n";
// int a[n];
// for(int i = 0; i < n; i++)
// a[i]=i+1;
// while(next_permutation(a+1,a+n)) {
// int flag=0;
// for(int i = 0; i < n; i++) {
// if(prim[a[(i+n)%n]+a[(i+1+n)%n]]) {
// flag=1;
// break;
// }
// }
// if(flag==0) {
// for(int i =0; i < n; i++)
// cout<<a[i]<<" ";
// cout<<endl;
// }
// }
return 0;
}