HDOJ 1016 Prime Ring Problem
题意:质数环,相邻的两个数加起来要是质数,这些数只能从2 - n 里面选择。
解题思路:纯 DFS ,需要注意的是最后一个数,和第一个数连在一起了所以还有判断arr[n-1] + arr[0] 是不是质数。
分类:DFS
6924508 | 2012-10-15 19:26:15 | Accepted | 1016 | 906MS | 260K | 996 B | C++ | 罗维 |
View Code
1 #include <iostream> 2 #include <memory.h> 3 using namespace std; 4 5 int n; 6 int arr[30]; 7 bool used[30]; 8 9 bool Is_prime(int k) 10 { 11 if(k == 2) 12 return true; 13 else 14 { 15 for (int i=2; i<(k + 1) / 2; i++) 16 { 17 if (k % i == 0) 18 return false; 19 } 20 return true; 21 } 22 23 } 24 25 26 void dfs(int p) 27 { 28 int i; 29 if (p == n) 30 { 31 cout<<arr[0]; 32 for (i=1; i<n; i++) 33 cout<<" "<<arr[i]; 34 cout<<endl; 35 return; 36 } 37 else 38 { 39 for (i=2; i<=n; i++) 40 { 41 42 if (p != n-1 && !used[i] && Is_prime(arr[p-1] + i)) 43 { 44 used[i] = true; 45 arr[p] = i; 46 dfs(p + 1); 47 used[i] = false; 48 } 49 else if(p == n-1 && !used[i] && Is_prime(arr[p-1] + i) 50 && Is_prime(arr[0] + i)) 51 { 52 used[i] = true; 53 arr[p] = i; 54 dfs(p + 1); 55 used[i] = false; 56 } 57 58 } 59 } 60 } 61 62 int main() 63 { 64 int t = 1; 65 while(cin>>n) 66 { 67 memset(used, false, sizeof(used)); 68 arr[0] = 1; 69 70 cout<<"Case "<<t++<<":"<<endl; 71 dfs(1); 72 cout<<endl; 73 } 74 return 0; 75 }