- Description
输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。n≤16。
- Input
输入正整数n,n≤16。
- Output
输出素数环序列,从整数1开始逆时针排列。
- Sample Input
6
- Sample Output
1 4 3 2 5 6
1 6 5 2 3 4
#include<iostream>
using namespace std;
int N,a[18]={0,1},visit[18]={0,0},isp[33];
void solve(int n)
{
if(n==N+1)
{
if(isp[a[n-1]+a[1]])
{
printf("1");
for(int i=2;i<=N;i++)
printf(" %d",a[i]);
puts("");
}
}
else
{
for(int i=2;i<=N;i++)
if(!visit[i]&&isp[a[n-1]+i])
{
a[n]=i;
visit[i]=1;
solve(n+1);
visit[i]=0;
}
}
}
int isprime(int i)
{
int j;
for(j=2;j*j<=i;j++)
if(i%j==0)return 0;
return 1;
}
int main()
{
for(int i=2;i<33;i++)
if(isprime(i))isp[i]=1;
scanf("%d",&N);
solve(2);
return 0;
}