素数环
-
描述
-
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
-
输入
- 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。 输出
- 每组第一行输出对应的Case序号,从1开始。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。
样例输入 -
6 8 3 0
样例输出 -
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2 Case 3: No Answer
当n为奇数时(n=1除外),肯定不能构成素数环,此时特殊判断一下即可,否则会超时
#include<stack> #include<queue> #include<math.h> #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,s[25],f[25],flag; struct node { int num,cnt; }; int isprime(int x) { int i; if(x==1) return 0; if(x==2) return 1; for(i=2; i<=sqrt(x); i++) { if(x%i==0) { return 0; } } return 1; } void dfs(node t) { int i; if(t.cnt==n&&isprime(f[1]+f[n])) { flag=1; for(i=1; i<=n; i++) printf("%d ",f[i]); printf("\n"); } else { for(i=2; i<=n; i++) { if(isprime(t.num+i)&&!s[i]) { node p; p.num=i; p.cnt=t.cnt+1; s[i]=1; f[p.cnt]=i; dfs(p); s[i]=0; } } } if(flag==0) return; } int main() { //freopen("Input.txt","r",stdin); //freopen("Output.txt","w",stdout); int bb=1; while(scanf("%d",&n)&&n) { printf("Case %d:\n",bb++); flag=0; if(n%2!=0&&n!=1) { printf("No Answer\n"); continue; } memset(s,0,sizeof(s)); memset(f,0,sizeof(f)); s[1]=1; f[1]=1; node t; t.num=1; t.cnt=1; dfs(t); if(flag==0) printf("No Answer\n"); } return 0; }