HDU 1016-Prime Ring Problem(DFS)

2015-07-20 17:26:31 · 作者: · 浏览: 6

Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 27595 Accepted Submission(s): 12271


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要求按字典序输出素数环。。DFS爆搜,不用剪枝。。一开始用 next_permutation()函数纯暴力判结果TLE了。。
#include 
   
    
#include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
              #include 
              
                #define L long long using namespace std; const int INF=0x3f3f3f3f; const int maxn=32; bool pri[100],vis[100]; int a[35],n; void init() { memset(pri,1,sizeof(pri)); pri[0]=0;pri[1]=0; for(int i=2;i<=100;i++) { if(pri[i]) { for(int j=2;j*i<=100;j++) pri[j*i]=0; } } } void dfs(int cur) { if(cur==n&&pri[a[n-1]+a[0]]) { printf("%d",a[0]); for(int i=1;i