Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Note: the number of first circle should always be 1.
Input
n (0 < n < 20).
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
68
Sample Output
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 3
//第一个元素一定是1 ,
//只有n为偶数和1才能构成素数环
# include<stdio.h>
# include<string.h>
# include<math.h>
int m,v[25],a[25],b[25];
int Np(int m){ //判断是不是素数
int k=sqrt(m*1.0);
int i;
if(m==1)
return 0;
for(i=2; i<=k; i++)
if(m%i==0)
break;
if(i>k)
return 1;
return 0;
}
//int NP[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1};或者这样判断素数
void dfs(int n)
{
if(n==m)
{
if(Np(a[m-1]+1)) //将最后一个元素与首元素相加判断是不是素数
{
printf("1");
for(int i=1;i<m;i++)
printf(" %d",a[i]);
printf("\n");
}
return ;
}
for(int i=2;i<=m;i++)
{
if(!v[i]&&Np(a[n-1]+i)) //判断当前元素与前一个元素的和是不是素数
{ v[i]=1; //如果if成立,将当前元素 标记,以后不再使用
a[n]=i;
dfs(n+1); //遍历
v[i]=0; //结束一次遍历后解除标记
}
}
}
int main(){
int k=1;
while(~scanf("%d",&m))
{
printf("Case %d:\n",k++);
int i;
memset(v,0,sizeof(v));
a[0]=1; //第一个元素一定是1
if(m%2==0||m==1) //只有m为偶数和1才能构成素数环
dfs(1);
printf("\n");
}
return 0;
}