您的位置:首页 > 其它

Prime Ring Problem(素数环问题)

2016-12-14 09:22 330 查看
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.



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.

Sample Input

6

8

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 2

思路:

该题目属于回溯,n>0 && n<20,所以任意两个相邻的数字和最大为2n-1,用素数打表,先求出所有的素数。构造一个n叉树,通过判断相邻两个数字的和,是否是素数,进行剪枝。构造树时,下面的子节点,还不能和上面的冲突。

#include<stdio.h>
#include<math.h>
#include<string.h>
int a[40],c[21];
int n,count;
int sum=0;//第几组测试数据

void prime(int num)
{//素数打表
int i,j;
for(i=2;i<=num;i++) {
for(j=i+i;j<=num;j+=i) {
a[j]=1;
}
}
}

int set(int i) {
//判断前面是否已经存在该数字
int j;
for(j=1;j<i;j++) {
if(c[j]==c[i])
return 0;
}
return 1;
}

void traceback(int row)
{
int i,j;
c[0]=1;
//因为是一个环,所以要判断最后一个和第一个相加是否为素数
if(row==n && a[1+c[n-1]]==0) {
count++;
for(i=0;i<n;i++) {
if(i==0)
printf("%d",c[0]);
else {
printf(" %d",c[i]);
}
}
printf("\n");
}
for(i=2;i<=n;i++){
c[row]=i;
int temp=c[row]+c[row-1];
if(a[temp]==0 && set(row))
traceback(row+1);
}
}

int main()
{
while(scanf("%d",&n)!=EOF) {
sum++;
printf("Case %d:\n",sum);
if(n>1 && n%2!=0) {   //对于大于1的奇数,都没有素数环
}
else {
count=0;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
prime(n*2);
traceback(1);
//printf("the result is %d\n",count);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: