机器人的运动范围(Python and C++解法)
2020-12-22 21:29
标签:def 进入 解法 cal 大于 使用 第一个 一个 pop 地上有一个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 输入:m = 3, n = 1, k = 0 来源:力扣(LeetCode) 由于是从坐标 [0,0]向周围扩散寻找答案,所以本题的搜索过程更加适合于用广度优先搜索算法来描述。 为了方便计算坐标数位之和,可以定义一个计算函数。 搜索过程中存在一个剪枝方法:只需要向下或者向右进行搜索,而不必向上或者向左进行搜索。 C++的实现中,学会使用pair和make_pair构建元组。 机器人的运动范围(Python and C++解法) 标签:def 进入 解法 cal 大于 使用 第一个 一个 pop 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13215610.html题目:
输出:3
示例 2:
输出:1
链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof思路:
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 and 0 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()在头文件