Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 43299 Accepted Submission(s): 19214
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
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素数环问题,相邻两数的和是素数。素数打表,dfs经典问题注意dfs的步骤,标记,深搜,消除标记#include<cstdio> #include<iostream> using namespace std; int mark[25], num[25]; int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37}; int n; bool is_prime(int x) { int i; for(i=0;i<12;i++) if(x==prime[i]) return true; return false; } void display() { int i; for(i=1;i<n;i++) printf("%d ",num[i]); printf("%d\n",num[n]); } int dfs(int k) { int i; if(k==n+1) { if(is_prime(num[k-1]+1)) display(); } else { for(i=2;i<=n;i++) { if(mark[i]&&is_prime(i+num[k-1])) { mark[i]=0; num[k]=i; dfs(k+1); mark[i]=1; } } } return 0; } int main() { //if(is_prime(37)) cout<<"*****"<<endl; int cnt=1; int i; while(scanf("%d",&n)!=EOF) { //cout<<n<<endl; printf("Case %d:\n",cnt++); if(n==1) {printf("1\n\n");continue;} mark[1]=0; for(i=2;i<=n;i++) mark[i]=1; num[1]=1; //for(i=1;i<=n;i++) cout<<mark[i]; //for(i=1;i<=n;i++) cout<<num[i]; dfs(2); printf("\n"); } return 0; }
1万+

被折叠的 条评论
为什么被折叠?



