Prime Ring Problem
Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 29 Accepted Submission(s) : 15
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.
Sample Input
6 8Sample OutputCase 1:1 4 3 2 5 61 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
代码如下:#include<iostream>#include<string.h>#include<stdio.h>using namespace std;int prime[38]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1}; //素数表,可以快速访问,0代表数组的下标不是素数,1代表数组的下标是素数。int A[30],n,B[30];void dfs(int posa)//posa是下标{int i;if(posa == n && prime[A[0]+A[n-1]])//如果下标等于n且首末元素和也是素数,符合题意,输出素数环{printf("1");for(i = 1;i < n; i++)printf(" %d",A[i]);printf("\n");}else{for(i = 2;i <= n; i++)//从2开始的原因是第一位确定是1{if(prime[i+A[posa-1]] && B[i])//如果当前元素加上前一个元素为素数且这个数字还没有使用过{A[posa]=i; //将i放入A数组B[i]=0; //i标记为已用dfs(posa+1);B[i]=1;//最终i还要恢复到可以访问}}}}int main(){A[0]=1; //A数组第一位永远是1int t=1; //t代表当前是第几组测试数据while(~scanf("%d",&n)) //多实例测试{
memset(B,1,sizeof(B)); //最初在对应的数组B都刷成1,代表所有的数字都没有被用过,用过后就刷为0;printf("Case %d:\n",t++);dfs(1); //调用深搜printf("\n");}return 0;}