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 }

你可能感兴趣的:(Prim)