Leetcode Link: 面试题13. 机器人的运动范围 - 力扣(LeetCode)
题目

解法一:像回溯又不是回溯
思路: 没什么特别的,本题需要的注意的是
走过一个位置之后,如果从这个位置退出来,则不需要再把这个位置重置为没有走过,不然会重复计算。
但是也不能直接算里面有多少满足k的那个条件的格子,有可能满足条件的我们不能走到那里。
题解:
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
mask = [[0 for _ in range(n)] for _ in range(m)]
res = 0
def bkt(i, j):
nonlocal res, k
# 其实没有base case了,不合理都进不来
res += 1
direc = [(1, 0), (0, 1), (0, -1), (-1 ,0)]
for d in direc:
ni = i + d[0]
nj = j + d[1]
if 0 <= ni < m and 0 <= nj < n and mask[ni][nj] == 0 and self.check(str(ni)+str(nj), k):
mask[ni][nj] = 1
bkt(ni, nj)
# 注意这里不需要把mask[i][j]重置回0,避免重复计算。
mask[0][0] = 1
bkt(0, 0)
return res
# 检查当前坐标是不是可以走的
# s 可以取 str(i)+str(j) 作为输入
def check(self, s: str, k: int):
lst = [int(x) for x in s]
return sum(lst) <= k