HDU 1016 Prime Ring Problem (Deep Search)
Prime Ring ProblemTime Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission (s): 32872 Accepted Submission (s): 14544
Problem Description A ring is compose of n circles as shown in digoal. put natural number 1, 2 ,..., n into each circle separately, and the sum of numbers in two adjacent circles shoshould be a prime.
Note: the number of first circle shoshould 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 abve process.
Print a blank line after each case.
Sample Input
68
Sample Output
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2
Source Asia 1996, Shanghai (Mainland China)
Recommend JGShining | We have carefully selected several similar problems for you: 1312 1072 1242 1175
All arrays between 1-N are required to form a ring, and the sum of two adjacent numbers is required to be a prime number.
Idea: because the data range of n is only 1-20, the sum of n cannot exceed 40, so the prime number within 40 is marked. Then, the DFS performs a deep search, and the direct output that matches the meaning of the question is enough.
,
Code:
#include
#include#include
#include
#include
#include
using namespace std;int pv[50];int n;int p[50];int v[50];void getprime(){ for(int i=1;i<50;i++) { pv[i] = 1; } for(int i=1;i<=41;i++) { int pi = sqrt(i); for(int j=2;j<=pi;j++) { if(i%j == 0) { pv[i] = 0; break; } } }}void DFS(int cnt,int x){ if(cnt == n && pv[p[n-1]+p[0]] == 1) { for(int i=0;i