python3 剑指刷题记录11

题目:
        地上有一个 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是计算位置的数位之和是多少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值