Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20105 Accepted Submission(s): 9001
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
Source
Recommend
JGShining
题意:素数环 (经典搜索)
代码:
写法1:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int yes[22]; bool in[22]; bool prim[50]; int n; void primtable() { int i,j; memset(prim,0,sizeof(prim)); for(i=3;i<=50;i++) { for(j=2;j<=i-1;j++) { if(i%j==0) prim[i]=true; } } } void dfs(int pos) { int i,u; if(pos>n) { int m=yes[1]+yes[n]; if(prim[m]==false) { for(i=1;i<=n;i++) printf("%d%c",yes[i],i==n?' ':' '); //printf(" "); //这里PE了一次 } return; } for(i=2;i<=n;i++) { u=i+yes[pos-1]; if(prim[u]==false&&in[i]==false) { yes[pos]=i; in[i]=true; dfs(pos+1); in[i]=false; } } } int main() { int cas=1; primtable(); while(scanf("%d",&n)!=EOF) { memset(in,0,sizeof(in)); yes[1]=1; in[1]=true; printf("Case %d: ",cas++); dfs(2); printf(" "); } return 0; } // 203MS
写法2:
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int yes[22]; bool in[22]; bool prim[50]; int n; void no_prim() { int tmp,i,j; for(i=3;i<20;i+=2) { if(prim[i]==false) { tmp=i<<1; for(j=i*i;j<50;j+=tmp) prim[j]=true; } } } void dfs(int pos) { int i,u; if(pos>n) { int m=yes[1]+yes[n]; if(prim[m]==false&&m%2||m==2) { for(i=1;i<=n;i++) printf("%d%c",yes[i],i==n?' ':' '); //printf(" "); } return; } for(i=2;i<=n;i++) { u=i+yes[pos-1]; if((!prim[u]&&u%2||u==2)&&in[i]==false) { yes[pos]=i; in[i]=true; dfs(pos+1); in[i]=false; } } } int main() { no_prim(); int cas=1; while(scanf("%d",&n)!=EOF) { memset(in,0,sizeof(in)); yes[1]=1; in[1]=true; printf("Case %d: ",cas++); dfs(2); printf(" "); } return 0; } // 234MS