hdoj1016 [dfs]

http://acm.hdu.edu.cn/showproblem.php?pid=1016

题意:

已知一个数n,在1-n(包含 n ,0 < n < 20)里组合形成一个环形,使得每两个相邻的数都是素数,每次都以1为开始,输出所有情况。

样例:

6

8

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深度优先搜索入门题目,暴力搜索即可以过了

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <cstdio>
 5 using namespace std;
 6 int visited[25];
 7 int load[25];
 8 int n;
 9 bool isprim(int n)
10 {
11     if (n == 3)
12         return true;
13     for (int i = 2; i<=sqrt(n); i++)
14     {
15         if (n%i == 0)
16             return false;
17     }
18     return true;
19 }
20 void dfs(int k,int v)
21 {
22     visited[v] = 1;
23     if (k == n)
24     {
25         if (isprim(v+1))
26         {
27             load[k] = v;
28             for (int j = 0; j < n; j++)
29             {
30                 printf("%d%c",load[j],j==n-1?'\n':' ');
31             }
32             return ;
33         }
34     }
35     for (int i = 2; i <= n; i++)
36     {
37         if (!visited[i] && isprim(v+i))
38         {
39             visited[i] = 1;
40             load[k] = i;
41             dfs(k+1,i);
42             visited[i] = 0;    // turn back
43             //load[cnt] = 0;
44         }
45     }
46     return;
47 }
48 int main()
49 {
50     int cas = 1;
51     while (cin >> n)
52     {
53         memset(visited,0,sizeof(visited));
54         memset(load,0,sizeof(load));
55         load[0] = 1;
56         printf("Case %d:\n",cas++);
57         dfs(1,1);
58         cout << endl;
59     }
60     return 0;
61 }

 

posted @ 2015-08-17 17:28  ediszhao  阅读(126)  评论(0编辑  收藏  举报