剑指Offer刷题笔记——机器人的运动范围

本文介绍了一种计算机器人在限定条件下方格地图中可达格子数量的算法。机器人从坐标(0,0)出发,只能向四个基本方向移动,且不能进入数位和超过阈值k的格子。通过深度优先搜索遍历所有可能路径,并标记已访问位置避免重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路:将地图全部置1,遍历能够到达的点,将遍历的点置0并令计数+1.

class Solution:    
    def __init__(self):        
        self.count = 0     
    def movingCount(self, threshold, rows, cols):        
        # write code here
        # 建立rows*cols大小全为1的二位矩阵        
        arr = [[1 for i in range(cols)] for j in range(rows)]
        # 从(0,0)开始找        
        self.findway(arr, 0, 0, threshold)        
        return self.count     
    def findway(self, arr, i, j, k):
        # 超出边界就返回None        
        if i < 0 or j < 0 or i >= len(arr) or j >= len(arr[0]):            
            return
        # 这句代码太妙了        
        tmpi = list(map(int, list(str(i))))        
        tmpj = list(map(int, list(str(j))))
        # 和超出限制  或者已经遍历过了 就返回        
        if sum(tmpi) + sum(tmpj) > k or arr[i][j] != 1:            
            return        
        # 记录已经走过的元素
        arr[i][j] = 0     
        # 计数   
        self.count += 1 
        # 上下左右的遍历,没有提前返回       
        self.findway(arr, i + 1, j, k)        
        self.findway(arr, i - 1, j, k)        
        self.findway(arr, i, j + 1, k)        
        self.findway(arr, i, j - 1, k)

tmpi = list(map(int, list(str(i))))      这句代码这是很巧妙:str(i)把整数变成字符串,是为把各个位上的数分开,map是对迭代对象的每一个元素做一个映射,所以就把最开始整数的所有的数字加在一起。最外面的list是因为在python3里,map返回的是迭代对象不是list,在python2 中不加也是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值