地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?用python完成并给出注释和时间复杂度和空间复杂度
时间: 2024-03-09 21:45:43 浏览: 121
python机器人行走步数问题的解决
题目分析:
这是一道深度优先搜索(DFS)的题目,我们可以从起点开始,每次向四个方向进行搜索,判断下一个格子是否满足数位之和小于等于k的条件,如果满足,则继续向下搜索,否则返回上一级。我们需要记录已经访问过的格子,以免重复访问。搜索结束后,已经访问的格子就是机器人可以到达的格子。
代码实现及注释如下:
```python
def movingCount(m: int, n: int, k: int) -> int:
# 定义数位和计算函数
def getDigitSum(num):
sum = 0
while num > 0:
sum += num % 10
num //= 10
return sum
# 定义深度优先搜索函数
def dfs(i, j):
nonlocal visited, res
# 判断当前格子是否满足条件
if i < 0 or i >= m or j < 0 or j >= n or visited[i][j] or getDigitSum(i) + getDigitSum(j) > k:
return
# 标记该格子已经访问过
visited[i][j] = True
res += 1
# 向四个方向进行搜索
dfs(i+1, j)
dfs(i-1, j)
dfs(i, j+1)
dfs(i, j-1)
# 初始化已访问矩阵和结果
visited = [[False for _ in range(n)] for _ in range(m)]
res = 0
# 从起点开始搜索
dfs(0, 0)
return res
# 测试
print(movingCount(2, 3, 1)) # 预期输出:3
```
时间复杂度分析:
对于每一个格子,我们最多只会访问一次,因此时间复杂度为 $O(mn)$。
空间复杂度分析:
我们需要一个 $m \times n$ 的 visited 矩阵来记录格子是否已经访问过,因此空间复杂度为 $O(mn)$。
阅读全文