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 }

 

posted on 2016-01-29 20:41  Sunny糖果  阅读(137)  评论(0编辑  收藏  举报