南沙C++信奧老師解一本通題:2110:【例5.1】素數環

南沙区信奥赛陈老师發表於2024-09-16

【題目描述】

輸入正整數n,把整數1,2,…,n 組成一個環,使得相鄰兩個整數之和均為素數。

【輸入】

輸入正整數n。

【輸出】

輸出任意一個滿足條件的環。

【輸入樣例】

6

【輸出樣例】

4 3 2 5 6 1

【提示】

資料滿足:

4≤n≤30

#include <bits/stdc++.h>
using namespace std;
int v[31],a[31],n;
bool isPrime(int n)
{
	for(int i=2;i<=sqrt(n);i++)
		if(n%i==0)
			return false;
	return true;
}
bool isPrimePair(int pos)
{
	if(pos==1)
		return isPrime(pos);
	else if(pos==n)
		return isPrime(a[1]+a[n]);
	return isPrime(a[pos-1]+a[pos]);
}
void dfs(int cnt)
{
	if(cnt>1&&isPrimePair(cnt)==false ) //新填的數不構成素數環,退出 
		return;
	if(cnt==n&&isPrimePair(n))
	{
		for(int i=1;i<=n;i++)
			cout<<a[i]<<" ";
		exit(0); //只需要一種,程式強制退出 
	}
	for(int i=1;i<=n;i++)
	{
		if(v[i]==0 ) //沒有被訪問且與上一個元素之和相加是素數  
		{
			a[cnt+1]=i;
			v[i]=1; //標記已填過數了 
			dfs(cnt+1);
			v[i]=0;// 回溯 
		}
	}
}
int main()
{
	cin>>n;
	a[1]=1;
	v[1]=1;
	dfs(1);
	return 0;
}
南沙C++信奧老師解一本通題:2110:【例5.1】素數環

相關文章