zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    CentOS75 安装 telnet 进行使用.
    Windows 创建计划任务 实现自动同步文件.
    qemu-img.exe 工具 简介
    中建项目环境迁移说明
    服务器内存最大大小限制
    bzip2 以及 tar 压缩/解压缩/.打包等工具软件
    Ubuntu18.04 安装后的简单实用设置[未完成]
    oracle 启动监听报错TNS-12547: TNS:lost contact
    Linux审计sudo
    OPENVAS运行
  • 原文地址:https://www.cnblogs.com/carolunar/p/6362426.html
Copyright © 2011-2022 走看看