剑指offer-python:11.机器人的运动范围

题目描述:

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

解析:

跟“矩阵中寻找单词”一样,使用溯源法。

https://blog.csdn.net/u014513323/article/details/119009297

代码:

class Solution:
    # def Judge(self, threshold, i, j):
    #     # 判断格子位数是否满足条件
    #     if sum(list(map(int, str(i) + str(j)))) <= threshold:
    #         return True
    #     else:
    #         return False
    #
    # def FindGrid(self, threshold, rows, cols, matrix, i, j):
    #     count = 0
    #     if i >= 0 and j >= 0 and i < rows and j < cols and self.Judge(threshold, i, j) and matrix[i][j] == 0:
    #         matrix[i][j] = 1
    #         count = 1 + self.FindGrid(threshold, rows, cols, matrix, i, j + 1) \
    #                 + self.FindGrid(threshold, rows, cols, matrix, i, j - 1) \
    #                 + self.FindGrid(threshold, rows, cols, matrix, i + 1, j) \
    #                 + self.FindGrid(threshold, rows, cols, matrix, i - 1, j)
    #     return count
    #
    # def movingCount(self, threshold, rows, cols):
    #     matrix = [[0 for i in range(cols)] for j in range(rows)]
    #     count = self.FindGrid(threshold, rows, cols, matrix, 0, 0)
    #     return count

    def movingCount(self, threshold, rows, cols):
        if threshold < 0 or rows <= 0 or cols <= 0:
            return 0
        all_mat = [False] * (rows * cols)
        return self.get_count(threshold , rows , cols , 0 , 0 , all_mat)

    def get_count(self , k , row , col , now_x , now_y , allmat):
        cnt = 0
        if 0<= now_x < col and 0<= now_y < row and not allmat[now_y * col + now_x]:
            allmat[now_y * col + now_x] = True
            if self.judge(now_x) + self.judge(now_y) <= k:
                cnt = 1 + self.get_count(k , row , col , now_x - 1 , now_y , allmat) \
                        + self.get_count(k , row , col , now_x + 1 , now_y , allmat) \
                        + self.get_count(k , row , col , now_x , now_y - 1 , allmat) \
                        + self.get_count(k , row , col , now_x , now_y + 1 , allmat)
        return cnt

    def judge(self , x):
        resume = 0
        while x != 0:
            resume += x % 10
            x //= 10
        return resume


k = 15
r = 20
l = 20
func = Solution()
x = func.movingCount(k , r , l )
print(x)

输出:359(测试案例为牛客网提交测试样例)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值