剑指 Offer 13. 机器人的运动范围
题目:剑指 Offer 13. 机器人的运动范围
解题思路1:DFS
机器人从(0,0)出发,只需向右和向下即可将所有的单元格遍历一次,遍历过程中加上限制条件。设置一个set用于存储遍历过的可行的单元格坐标,代码如下:
时间:\(O(MN)\)
空间:\(O(MN)\)
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
# 求数位和
def ssum(a):
res = 0
while a:
res += a % 10
a //= 10
return res
def dfs(i, j):
if not 0 <= i < m or not 0 <= j < n or ssum(i) + ssum(j) > k: return 0
if (i, j) not in visited:
visited.add((i, j))
return 1 + dfs(i+1, j) + dfs(i, j+1)
else:
return 0
visited = set()
return dfs(0, 0)
优质解答:(参考自K神)
思想基本相同,优化了取数位和的方法。
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
def dfs(i, j, si, sj):
if i >= m or j >= n or k < si + sj or (i, j) in visited: return 0
visited.add((i,j))
return 1 + dfs(i + 1, j, si + 1 if (i + 1) % 10 else si - 8, sj) + dfs(i, j + 1, si, sj + 1 if (j + 1) % 10 else sj - 8)
visited = set()
return dfs(0, 0, 0, 0)