素数环
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
有一个整数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
- 来源
- hdu改编
- 上传者
- 丁国强
- 简单的dfs.....
- coder:
-
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int save[21],ans[21],step,n; 5 void dfs() 6 { 7 int i,k; 8 if(step==n) 9 { 10 if(ans[step-1]%2==0&&ans[step-1]!=8&&ans[step-1]!=14) 11 { 12 printf("1"); 13 for( k=1;k<n;k++) 14 { 15 printf(" %d",ans[k]); 16 } 17 /*puts("");*/ 18 putchar(10); 19 } 20 return ; 21 } 22 for(i=1;i<n;i++) 23 { 24 if(save[i]!=0) 25 { 26 int temp=ans[step-1]+save[i]; 27 if(temp==2||temp==3||temp==5||(temp%2!=0&&temp%3!=0&&temp%5!=0)) 28 { 29 int tem=save[i]; 30 ans[step++]=tem; 31 save[i]=0; 32 dfs(); 33 ans[--step]=0; 34 save[i]=tem; 35 } 36 } 37 } 38 } 39 40 int main() 41 { 42 int Case=1,i; 43 for( i=0;i<20;i++) 44 { 45 save[i]=i+1; 46 } 47 ans[0]=1; 48 while(scanf("%d",&n),n) 49 { 50 51 step=1; 52 printf("Case %d: ",Case++); 53 if(n==1) 54 { 55 printf("1 "); 56 continue; 57 } 58 if(n&1) 59 printf("No Answer "); 60 else 61 dfs(); 62 } 63 return 0; 64 }