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

题目: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 }
原文地址:https://www.cnblogs.com/carolunar/p/6362426.html