• 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 }
  • 相关阅读:
    CH4302 Interval GCD
    20201017 模拟赛总结
    LOJ#2610. 「NOIP2013」货车运输
    POJ3696 The Luckiest number
    20200925 小练习总结
    更新一波状态
    AFO
    【扩展lucas定理】
    【LCT维护子树信息】uoj207 共价大爷游长沙
    [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)
  • 原文地址:https://www.cnblogs.com/carolunar/p/6362426.html
Copyright © 2020-2023  润新知