//输入一个正整数n,使得1~n组成一个排列,相邻的两个数字之和为素数,从1开始输出
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 100;
int n;//输入
int A[maxn];//存放结果
int vis[maxn];//用来标记是否已经使用
bool isprime(int x)//判断是否为素数
{
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)
return false;
return true;
}
void bfs(int cur)//回溯法
{
if(cur==n&&isprime(A[0]+A[n-1]))//递归边界并判断数列前后是否相加为素数
{
for(int i=0;i<n;i++)//输出
cout<<A[i];
cout<<endl;
}else
for(int i=2;i<=n;i++)//对于1~n
{
if(!vis[i]&&isprime(i+A[cur-1]))//判断这个数是否被调用,同时判断是否与前一个数的和为素数
{
vis[i]=1;//标记已用
A[cur]=i;//同时填值
bfs(cur+1);//下个递归
vis[i]=0;//同层还原
}
}
}
int main()
{
cin>>n;
A[0]=1;
bfs(1);
system("pause");
}
//回溯法输出素数环
最新推荐文章于 2022-12-09 22:20:42 发布