描述
输入正整数n,把整数1,2,3,…,n组成一个环,使得相邻两个整数之和为素数。输出时从整数1开始逆时针排列。同一个环应恰好输出一次。1<n≤16。
输入
输入正整数n,1<n≤16。
输出
输出素数环序列,从整数1开始逆时针排列。
样例输入
6
样例输出
1 4 3 2 5 6
1 6 5 2 3 4
#include <iostream>
using namespace std;
const int PRIME[] = {0, 0, 1, 1, 0, 1, 0, 1, 0, 0,
0, 1, 0, 1, 0, 0, 0, 1, 0, 1,
0, 0, 0, 1, 0, 0, 0, 0, 0, 1,
0, 1};
int isPrime(int a)
{
return PRIME[a];
}
void search(int *p, int index, int length)
{
int i,j,t;
if(index==length&&isPrime(p[0]+p[length-1]))
{
printf("%d", p[0]);
for(i=1;i<length; i++)
printf(" %d",p[i]);
printf("\n");
return;
}
for(i=index;i<length;i++)
{
t = p[i];
for(j=i;j>index;j--)
p[j]=p[j-1];
p[index]=t;
if(isPrime(p[index]+p[index-1]))
{
search(p,index+1,length);
}
t = p[index];
for(j=index;j<i;j++)
p[j]=p[j+1];
p[i]=t;
}
}
void searchPrimeRing(int a)
{
int list[16],i;
for(i=0;i<a;i++)
list[i]=i+1;
search(list,1,a);
}
int main()
{
int n,i = 1;
scanf("%d",&n);
searchPrimeRing(n);
i++;
return 0;
}