1104-素数环
描述
输入正整数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; }