面试题13.机器人的运动范围_hn
2020-03-29 本文已影响0人
1只特立独行的猪
题目描述
地上有一个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
解答方法
方法一:BFS
思路
广度优先搜索一般使用队列来实现。我们先将 (0, 0)加入队列,当队列不为空时,每次将队首坐标出队,加入到集合中,再将满足以上两个条件的坐标加入到队尾,直到队列为空。
代码
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
def sums(x):
sum = 0
while x:
sum += x%10
x //= 10
return sum
marked = set()
queue = [(0, 0)]
while queue:
x, y = queue.pop(0)
if (x, y) not in marked and sums(x)+sums(y) <=k:
marked.add((x,y))
#仅考虑向右和向下
for dx, dy in [(0,1), (1, 0)]:
new_x = x + dx
new_y = y + dy
if new_x >=0 and new_x < m and new_y >=0 and new_y < n:
queue.append((new_x, new_y))
return len(marked)
时间复杂度
O(m×n)
空间复杂度
O(m×n)