素数环 南阳acm488(回溯法)
Posted -skyblue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数环 南阳acm488(回溯法)相关的知识,希望对你有一定的参考价值。
素数环
时间限制: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改编
- 上传者
- ACM_丁国强
-
1 #include<stdio.h> 2 #include<string.h> 3 int a[99],b[99],c[99]; 4 //a[99]数组用来放0,1是奇数就放1反之,b[99]数组用判断1~n个数中是否放入c[99]数组里放入就1反之,c[99]数组用来存放1~n; 5 int f(int x) //用来判断是否为素数,是就返回1 6 { 7 int i; 8 for(i=2;i*i<=x;i++) 9 { 10 if(x%i==0) 11 return 0; 12 } 13 return 1; 14 } 15 void f1(int x,int n) 16 { 17 int i; 18 if(x==n&&a[c[0]+c[n-1]]) //如果c[0]+[n-1](也就是头尾相加)也为奇数时满足 19 { 20 for(i=0;i<n;i++) 21 printf("%d ",c[i]); 22 printf(" "); 23 return; 24 } 25 for(i=2;i<=n;i++) 26 { 27 if(!b[i]&&a[i+c[x-1]]) //当前的i+c[x-1](也就是i+它上一个相连的数)也为奇数时 28 { 29 c[x]=i; 30 b[i]=1; 31 f1(x+1,n); //递归 32 b[i]=0; //回溯 33 } 34 } 35 } 36 int main() 37 { 38 int i,n,ans; 39 ans=1; 40 for(i=2;i<=40;i++) 41 a[i]=f(i); 42 while(scanf("%d",&n)!=EOF,n) 43 { 44 memset(b,0,sizeof(b)); 45 c[0]=1; //第一个位置放1; 46 if(n==1) //特殊情况 47 { 48 printf("Case %d: 1 ",ans++); 49 continue; 50 } 51 if(n%2==1) //奇数不行 52 { 53 printf("Case %d: No Answer ",ans++); 54 continue; 55 } 56 else 57 { 58 printf("Case %d: ",ans++); 59 f1(1,n); 60 continue; 61 } 62 } 63 return 0; 64 }
以上是关于素数环 南阳acm488(回溯法)的主要内容,如果未能解决你的问题,请参考以下文章