码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj1016 [dfs]

时间:2015-08-17 18:57:37      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 

hdoj1016 [dfs]

标签:

原文地址:http://www.cnblogs.com/ediszhao/p/4737190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!