0
点赞
收藏
分享

微信扫一扫

LC: 剑指 Offer 13. 机器人的运动范围

先峰老师 2022-04-24 阅读 47

题目:

剑指 Offer 13. 机器人的运动范围。
地上有一个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。请问该机器人能够到达多少个格子?

链接:https://leetcode-cn.com/leetbook/read/illustrate-lcof/eoci8c/

示例:

提示
1 <= n,m <= 100
0 <= k <= 20

思路:

首先,创建m*n的布尔矩阵,初始值赋为False,辅助判断元素是否被计算。

然后,从数组起点位置开始递归搜索,终止条件为元素超出数组边界,或数字拆分后的和大于k,或该元素已计算。满足终止条件,返回0,否则将该位置元素标记为True,到达的格子数加1,继续从该元素的下和右两个方向遍历。

最后,返回最终结果。

代码:

class Solution:
    def movingCount(self, m: int, n: int, k: int) -> int:
        visited = [[False for j in range(n)] for i in range(m)]
        def dfs(i, j, visited):
            if i>=m or j>=n or i//10 + i%10 + j//10 + j%10 > k or visited[i][j]:
                return 0
            visited[i][j] = True
            return dfs(i+1, j, visited) + dfs(i, j+1, visited)+1
        return dfs(0, 0, visited)

时间复杂度O(mn),空间复杂度O(mn).

举报

相关推荐

0 条评论