素数环
时间限制: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
本来挺简单的一题,先是TLE然后是wa,仔细检查才发现,少了个23,他也是素数,于是乎,AC了1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 int vis[20]={0}; 7 int isp[40]; 8 int A[20]; 9 int n; 10 int mm; 11 void fuu() 12 { 13 int i; 14 for(i=0;i<=20;i++) 15 A[i]=i+1; 16 } 17 void fun()//打表所有素数 18 { 19 memset(isp,0,sizeof(isp)); 20 isp[2]=1;isp[3]=1;isp[5]=1;isp[7]=1;isp[11]=1;isp[13]=1,isp[17]=1; 21 isp[19]=1;isp[23]=1;isp[29]=1;isp[31]=1;isp[37]=1;//一开始少写了个23 22 } 23 void dfs(int cur)//从1开始算起 24 { 25 int i; 26 if(cur==n && isp[A[0]+A[n-1]])//递归的边界。别忘了测试第一个数据,和最后一个数据 27 { 28 for(i=0;i<n;i++)//打印方案 29 printf("%d ",A[i]); 30 mm=1; 31 printf(" "); 32 } 33 else 34 for(i=2;i<=n;i++)//尝试放置每个数i 35 if(!vis[i] && isp[i+A[cur-1]])//如果i没有用过,并且和前一个数之和为素数; 36 { 37 A[cur]=i; 38 vis[i]=1;//设置使用标志 39 dfs(cur+1); 40 vis[i]=0;//清除标志 41 } 42 return ; 43 } 44 int main() 45 { 46 fuu();fun();//事先存好 47 int k=1; 48 while(scanf("%d",&n) && n!=0) 49 {mm=0; 50 printf("Case %d: ",k++); 51 if(n==1) 52 printf("1 "); 53 else if(n%2==1) 54 printf("No Answer "); 55 else{ 56 dfs(1); 57 if(!mm) 58 printf("No Answer "); 59 } 60 } 61 return 0; 62 }