首页 > 其他 > 详细

POJ 3050 Hopscotch 题解 《挑战程序设计竞赛》

时间:2017-02-03 13:38:50      阅读:218      评论:0      收藏:0      [点我收藏+]

题目:POJ 3050

思路:

看了@Lorazepam的代码

原本的思路是用 vector<int> 存放生成的整数,这样还需要在放进去之前把位数乘基数变成相应整数,而且需要对 vector 去重

然后才发现有 set 这一好用容器,插入值重复的话会插入失败,因此最后只要用 .size() 就可以得到所有的可能性了。并且不用bother to生成整数,直接当成字符串放进去就好了。

用DFS,网格上的每一点都依次作为起点开始深搜,每跳一步 n 就加 1,当 n 为 6 时,说明前面已经有 0~5 这 6 步了, 返回。

因为有 n 为 6 做限制,所以就算可以重复访问,也不会无限循环。

 

还需进一步领会深搜和广搜的精神。

 1 #include <iostream>
 2 #include <set>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 int grid[5][5];
 8 int dx[4] = {-1, 0, 1, 0};
 9 int dy[4] = {0, -1, 0, 1};
10 char digits[6];
11 set<string> integers; 
12 
13 void dfs(int x, int y, int n) {
14     if (n == 6) {
15         string temp = digits;
16         integers.insert(temp);
17         return;
18     }
19     digits[n] = grid[x][y] + 0;
20     for (int i = 0; i < 4; i++) {
21         int nx = x + dx[i];
22         int ny = y + dy[i];
23         if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
24             dfs(nx, ny, n + 1);
25         }
26     }      
27 }
28 
29 int main() {
30     for (int i = 0; i < 5; i++) {
31         for (int j = 0; j < 5; j++) {
32             cin >> grid[i][j];
33         }
34     }
35     
36     for (int i = 0; i < 5; i++) {
37         for (int j = 0; j < 5; j++) {
38             dfs(i, j, 0);
39         }
40     }   
41     cout << integers.size();
42     return 0; 
43 }

 

POJ 3050 Hopscotch 题解 《挑战程序设计竞赛》

原文:http://www.cnblogs.com/carolunar/p/6362426.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!