剑指 Offer 13. 机器人的运动范围-python题解

地上有一个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。请问该机器人能够到达多少个格子?

示例 1:

输入:m = 2, n = 3, k = 1
输出:3
示例 2:

输入:m = 3, n = 1, k = 0
输出:1
提示:

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

class Solution:
    def movingCount(self, m: int, n: int, k: int) -> int:
        # m行,n列,k为限定值
        # 存储已访问过的元素
        access_set = set()

        # 从左上角开始搜索
        i = 0
        j = 0
        # 能够达到格子的个数
        access_num = 0
        return self.dfs(m, n, i, j, k, access_set, access_num)
    # m:行数
    # n:列数
    # i:访问的行坐标
    # j:访问的列坐标
    # k:限定值
    # access_set:存储访问过元素索引的集合
    # access_num:可以访问的数量
    def dfs(self, m, n, i, j, k, access_set, access_num):
        #  如果访问的索引越界,则返回0
        if( i >= m or j >= n ):
            return 0
        # 如果元素已经被访问过,则返回0
        str_index = str(i) + ',' + str(j)
        if ( str_index in access_set):
            return 0
        
        # 满足要求则计算+1

        # print(str_index, self.get_sum(i, j), k)
        access_set.add(str_index)
        if self.get_sum(i, j) <= k:
            access_num += 1
            # print(1111, access_num)
            # 向下搜索
            i1 = i + 1
            access_num += self.dfs(m, n, i1, j, k, access_set, 0)

            # 向右搜索
            j1 = j + 1
            access_num += self.dfs(m, n, i, j1, k, access_set, 0)

            return access_num
        else:
            access_set.remove(str_index)
            return 0

    
    # i:行索引
    # j:列索引
    #  获取索引值的和
    def get_sum(self, i, j):

        sum_index = 0
        while( i != 0 ):
            sum_index += i % 10
            i = i // 10
        while( j != 0):
            sum_index += j % 10
            j = j // 10

        return sum_index
        
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值