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叉树,通过判断相邻两个数字的和,是否是素数,进行剪枝。构造树时,下面的子节点,还不能和上面的冲突。
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; }
相关文章推荐
- HDU 1016 Prime Ring Problem(DFS 素数环问题)
- Prime Ring Problem 素数环问题
- HD 1016 Prime Ring Problem(素数环问题)
- 题目1459:Prime ring problem(素数环问题)
- hdu 1016 Prime Ring Problem(素数环)
- hdu 1016 Prime Ring Problem(素数环,超时)
- hdoj 1016 Prime Ring Problem【素数环】
- hdoj problem 1016 Prime Ring Problem(素数环&&素数问题+DFS(回溯法))
- ZOJ-1457 prime ring problem 素数环 题解
- hdu 1016 Prime Ring Problem(dfs,素数环)
- Prime is problem - 素数环问题
- Hdu 1016 Prime Ring Problem (素数环经典dfs)
- HDOJ-1016-Prime Ring Problem(素数环)【DFS】
- HDU 1016 Prime Ring Problem 素数环
- hdu-1016 Prime Ring Problem(素数环) DFS解法
- UVa 524 Prime Ring Problem(素数环)
- UVA - 524 Prime Ring Problem (经典回溯问题)
- HDU 1016 Prime Ring Problem(素数环)
- hdu1016-Prime Ring Problem 素数环
- HDU 1016 Prime Ring Problem(素数环)