机器人的运动范围
题目描述
-
地上有一个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
-
提示:
1 <= n,m <= 100 0 <= k <= 20
解答
-
# 求各位数字和市委数字的和 def digitsum(n): ans = 0 while n: ans += n % 10 n //= 10 return ans class Solution: def movingCount(self, m: int, n: int, k: int) -> int: from queue import Queue q = Queue() q.put((0, 0)) s = set() while not q.empty(): x, y = q.get() if (x, y) not in s and 0 <= x < m and 0 <= y < n and digitsum(x) + digitsum(y) <= k: # 将符合条件的方块放入到集合中 s.add((x, y)) # 遍历所有的方块,全部放入队列 for nx, ny in [(x + 1, y), (x, y + 1)]: q.put((nx, ny)) return len(s)
分析
复杂度分析
时间复杂度:O(mn)O(mn),其中 m 为方格的行数,n 为方格的列数。考虑所有格子都能进入,那么搜索的时候一个格子最多会被访问的次数为常数,所以时间复杂度为 O(2mn)=O(mn)O(2mn)=O(mn)。
空间复杂度:O(mn)O(mn),其中 m 为方格的行数,n 为方格的列数。搜索的时候需要一个大小为 O(mn)O(mn) 的标记结构用来标记每个格子是否被走过。