1114. 素数环

单点时限: 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40394960/article/details/106047952