1. 程式人生 > >素數環問題之解題報告

素數環問題之解題報告

                                            Prime Ring Problem

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


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)來解決這個問題;
但是在深搜過程中由於有很多判斷條件,所以導致理解起來有點的難度,但是隻要靜下心來,你就會明白的。

程式碼:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 25

using namespace std;

int  prime[N],sign[N];   //sign來表示是否已訪問過 ,prime來儲存滿足條件的數 
int  map[]={2,3,5,7,11,13,17,19,23,29,31,37}; //素數表提高效率 
int isprime[40];    //判斷是否是素數 
int  n;

bool DFS(int x,int cur)
{
     prime[x] = cur;
     if(x==n-1)
     {
         if(!isprime[cur+1])
            return false;
         for(int i=0;i<n;++i){
             printf("%d",prime[i]);
             printf("%c",i==n-1?'\n':' ');
         }
         return false;
     }
     else
     {
         for(int i=2;i<=n;++i)
         {
            if(sign[i])   
               continue;
            sign[i] = 1;
            if(isprime[cur+i]&&DFS(x+1,i))
               return true;
            sign[i] = 0;
         }
     }
     return false;
}

int  main(void)
{
     while(~scanf("%d",&n))
     {
         memset(isprime,0,sizeof(isprime));
         for(int i=0;i<12;++i)
            isprime[map[i]] = 1;   //標記素數 
         int cas = 1;
         memset(sign,0,sizeof(sign));
         
         printf("Case %d:\n",cas++);
         DFS(0,1);
     }
     
     return 0;
} 

如果你還想做一些這類題來鞏固你對於這類問題理解的話可以點選下面的連結:
(づ ̄3 ̄)づ╭❤~點一下我這個傳送門吧