zoukankan      html  css  js  c++  java
  • 机器人的运动范围(Python and C++解法)

    题目:

      地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

    示例 1:

    输入:m = 2, n = 3, k = 1
    输出:3
    示例 2:

    输入:m = 3, n = 1, k = 0
    输出:1

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof

    思路:

      由于是从坐标 [0,0]向周围扩散寻找答案,所以本题的搜索过程更加适合于用广度优先搜索算法来描述。

      为了方便计算坐标数位之和,可以定义一个计算函数。

      搜索过程中存在一个剪枝方法:只需要向下或者向右进行搜索,而不必向上或者向左进行搜索。

      C++的实现中,学会使用pair和make_pair构建元组。

    Python解法:

     1 class Solution:
     2     def calIndex(self, p):  # 计算坐标的数位之和
     3         indexSum = 0
     4         while p != 0:
     5             indexSum += (p % 10)
     6             p //= 10
     7         return indexSum
     8     def movingCount(self, m: int, n: int, k: int) -> int:
     9         q = []  # 定义一个队列
    10         q.append((0, 0))
    11         s = set()  # 去重后的结果
    12         while len(q) != 0:
    13             x, y = q.pop(0)  # python的pop默认弹出的是列表最后一个元素
    14             if (x, y) not in s and 0 <= x < m and 0 <= y < n and self.calIndex(x) + self.calIndex(y) <= k:
    15                 s.add((x, y))
    16                 # 只有当(x, y)符合条件,(x+1, y)和(x, y+1)才有可能符合条件
    17                 for nx, ny in [(x+1, y), (x, y+1)]:
    18                     q.append((nx, ny))
    19         return len(s)

    C++解法:

     1 class Solution {
     2 public:
     3     int calIndex(int p) {  // 计算坐标位数之和
     4         int indexSum = 0;
     5         while(p != 0) {
     6             indexSum += (p % 10);
     7             p /= 10;
     8         }
     9         return indexSum;
    10     }
    11     int movingCount(int m, int n, int k) {
    12         // pair<>以及make_pair()在头文件<utility>中
    13         queue<pair<int, int>> q;  // 元素为元组
    14         q.push(make_pair(0, 0));  // 构建元组,并将起点元组加入队列
    15         set<pair<int, int>> s;
    16 
    17         while(!q.empty()) {
    18             auto aQueue = q.front();
    19             int x = aQueue.first;  // 元组的第一个元素
    20             int y = aQueue.second;  // 元组的第二个元素
    21             q.pop();
    22             if((s.find(aQueue) == s.end()) && x >= 0 && x < m && y >=0 && y < n && (calIndex(x) + calIndex(y) <= k)) {
    23                 s.insert(make_pair(x, y));
    24                 q.push(make_pair(x+1, y));
    25                 q.push(make_pair(x, y+1));
    26             }
    27         }
    28         return s.size();
    29     }
    30 };
  • 相关阅读:
    python中的map,reduce,filter函数和lambda表达式
    GAN相关:SRGAN,GAN在超分辨率中的应用
    GAN相关:PAN(Perceptual Adversarial Network)/ 感知对抗网络
    GAN相关 : pix2pix模型
    GAN相关(二):DCGAN / 深度卷积对抗生成网络
    NCRE-3 网络技术概念图:局域网技术
    NCRE-3 网络技术概念图:路由设计基础
    NCRE-3 网络技术概念图:IP地址规划设计技术
    NCRE-3 网络技术概念图:中小型网络系统总体规划与设计方法
    NCRE-3 网络技术概念图:网络系统结构与设计基本原则
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13215610.html
Copyright © 2011-2022 走看看