题目:
地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。 例如,当 threshold 为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?
数据范围: 0 ≤ threshold ≤ 15 ,1 ≤ rows ,cols ≤ 100
思路:
1、跟上一题的路径搜索思路差不多,先限制输入,然后进行遍历,对路径堵塞的情况进行分析。
2、三个情况,判断是否越界、位数和是否大于输入threshold、是否是已经达到过的格子,这三种情况下返回空。
3、非三种情况下就记录当前位置,然后继续递归其他方向位置是否合适,返回的是记录的所有位置长度。
def movingCount(self, threshold: int, rows: int, cols: int) -> int:
# write code here
def sumofDigit(x, y):
result = 0
while x > 0:
result += x % 10
x //= 10
while y > 0:
result += y % 10
y //= 10
return result
def dfs(i, j):
if (
i == rows
or j == cols
or sumofDigit(i, j) > threshold
or (i, j) in marked
):
return
marked.add((i, j))
dfs(i + 1, j)
dfs(i, j + 1)
marked = set()
dfs(0, 0)
return len(marked)
dfs是递归,用作检索四个方向位置是否合适,合适则进行记录marked
sumofDigit是计算位置的数位之和是多少