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 }
posted @ 2012-10-15 19:30  旅行的蜗牛  阅读(156)  评论(0编辑  收藏  举报