Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37703 Accepted Submission(s): 16659
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
Source Asia 1996, Shanghai (Mainland China)
|
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 bool vis[20]; 6 int a[20]; 7 int n; 8 bool prime(int m) 9 { 10 if(m==1) return false; 11 if(m==2) return true; 12 for(int i=2;i*i<=m;i++) 13 if(m%i==0) return false; 14 return true; 15 } 16 void dfs(int m) 17 { 18 if(m==n&&prime(a[m-1]+a[0])){ 19 for(int i=0;i<m;i++){ 20 if(i) cout<<" "; 21 cout<<a[i]; 22 } 23 cout<<endl; 24 } 25 else{ 26 for(int i=2;i<=n;i++){ 27 if(!vis[i]){ 28 if(prime(i+a[m-1])){ //是否和相邻的加起来是素数 29 vis[i]=1;//标记了 30 a[m++]=i;//放进数组 31 dfs(m); //递归调用 32 vis[i]=0; //退去标记 33 m--; 34 } 35 } 36 } 37 } 38 } 39 int main() 40 { 41 int j=0; 42 while(cin>>n){ 43 cout<<"Case "<<++j<<":"<<endl; 44 memset(vis,0,sizeof(vis)); 45 a[0]=1; 46 dfs(1); 47 cout<<endl; 48 } 49 return 0; 50 }