python每日一题【剑指 Offer 13. 机器人的运动范围】
admin
2024-03-02 10:21:28
0次

day23-2022.11.18

题目信息来源
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm
来源:力扣(LeetCode)

剑指 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。请问该机器人能够到达多少个格子?
示例 1:

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

提示:

  • 1 <= n,m <= 100

  • 0 <= k <= 20

题解:个人版

昨天做了一题,总之能照猫画虎做出来一题

  • 递归参数:行坐标i, 列坐标j

  • 终止条件:超出边界,不符合规则,已经看过的地方。用了一个二维列表来标记,还踩了雷。

  • 递推工作:标记已经选过的列表,搜索下一个单元格,计数

  • 返回值:无。选择了一个全局变量来计数,说实话,我没太想好怎么在递归中计数,这个尝试失败了

相关知识点

行坐标和列坐标的数位之和计算,设行坐标为i,列坐标为j,则计算行坐标数位之和为i//10+i%10,即整除和取余。我这里可能钻了测试题的漏洞,如果出现m,n=100,可能就bug了。

class Solution:def movingCount(self, m: int, n: int, k: int) -> int:# 递归参数:行坐标i, 列坐标j# 终止条件:超出边界,不符合规则# 递推工作:标记已经选过的列表,搜索下一个单元格,计数# 返回值self.m, self.n, self.k = m, n, kself.result = 0self.myset = [[0 for x in range(n)] for x in range(m)]self.move(0, 0)return self.resultdef move(self, i, j):if i>=self.m or j>=self.n:return#if i<0 or i>=self.m or j<0 or j>=self.n:returnif self.myset[i][j]==1:returnif self.myset[i][j]==0:self.myset[i][j] = 1if (i//10+i%10+j//10+j%10)>self.k:returnelse:self.result = self.result + 1# self.move(i-1, j)self.move(i+1, j)# self.move(i, j-1)self.move(i, j+1)return

题解:官方

官方题解知识点重点

  1. 数位增量和公式解释:若x和x+1不超过两位数
  • 当 x+1//10=0x+1//10=0x+1//10=0 时,xxx 的个位为9,x+1x+1x+1 的个位为0,比 xxx 小9,x+1x+1x+1 的十位比 xxx 的十位大1,整体就比 xxx 小8
  • 当 x+1//10≠0x+1//10\neq0x+1//10​=0 时,就比 xxx 大1
  1. 理解不可达解:有限制,机器人每次只能走一步。只有之前走过的连通了才可以。
  2. 剪枝:分析可知机器人可通过只往增序列处走就能访问所有可达解。(然后我偷偷注释了我代码里递归的两行,试了一下,确实不影响结果并且提升了速度减少了内存)
  3. 我也尝试用set()来标记走过的点,来剪枝,但是失败了,因为我的语法是set.add([i,j]),看了解析用的是set.add((i,j))
  4. 关于我没法把计数放到递归里的解决方案:解析里用的是+,如果不符合条件的直接会返回 0,所以会没有变化,其他情况都是被1+

but,官方解析里si,sj的写法很容易混淆,其实就是 x 和 x+1 的数位之和

广度优先遍历 BFS

以平推的方式向前搜索,通常会利用队列实现。

  • 初始化:将初始点加入队列
  • 迭代终止条件:队列为空
  • 迭代工作:
    • 出队
    • 判断是否跳过
    • 标记
    • 入队

尝试复现官方题解的广度优先遍历

class Solution:def movingCount(self, m: int, n: int, k: int) -> int:# 初始化需要队列遍历存储遍历的列表,需要一个列表存储已经标记过的格子myqueue = [(0, 0, 0, 0)]choosed = set()while myqueue:x, y, sum_x, sum_y = myqueue.pop(0)if x>=m or y>=n or sum_x+sum_y>k or (x,y) in choosed:continuechoosed.add((x, y))myqueue.append((x+1, y, sum_x+1 if (x+1)%10!=0 else sum_x-8, sum_y))myqueue.append((x, y+1, sum_x, sum_y+1 if (y+1)%10!=0 else sum_y-8))return len(choosed)

相关内容

热门资讯

玩家必看科普透视挂!神兽透视挂... 玩家必看科普透视挂!神兽透视挂AI工具,神兽多功能好像真的有透视挂工具该软件可以轻松地帮助玩家将神兽...
揭秘透视挂!八戒透视挂AI软件... 揭秘透视挂!八戒透视挂AI软件,八戒多功能本来是真的有透视挂软件八戒脚本下载中分为三种模型:八戒挂靠...
重磅来袭外挂!葫芦岛爱玩麻将外... 重磅来袭外挂!葫芦岛爱玩麻将外挂AI攻略,葫芦岛爱玩麻将多功能确实是真的有外挂攻略1、葫芦岛爱玩麻将...
玩家必看科普辅助器!龙娱辅助器... 玩家必看科普辅助器!龙娱辅助器AIapp,龙娱多功能其实是有辅助器app1、下载好龙娱透视辅助下载之...
玩家必备教程透视挂!众乐乐透视... 玩家必备教程透视挂!众乐乐透视挂AI攻略,众乐乐多功能真是是真的有透视挂攻略1、点击下载安装,众乐乐...
发现玩家透视挂!南京麻将透视挂... 发现玩家透视挂!南京麻将透视挂AI软件,南京麻将多功能果然存在有透视挂软件1、不需要AI权限,帮助你...
分享一款透视器!聚闲游戏透视器... 分享一款透视器!聚闲游戏透视器AI方法,聚闲游戏多功能好像真的有透视器方法1、该软件可以轻松地帮助玩...
一分钟揭秘辅助!会星盟辅助AI... 一分钟揭秘辅助!会星盟辅助AI脚本,会星盟多功能切实是真的有辅助脚本1、该软件可以轻松地帮助玩家将会...
玩家爆料辅助器!杜鹃花辅助器A... 玩家爆料辅助器!杜鹃花辅助器AI攻略,杜鹃花多功能一贯有辅助器攻略亲,关键说明,杜鹃花透视脚本安卓赛...
我来分享辅助器!兴动游戏辅助器... 我来分享辅助器!兴动游戏辅助器AI教程,兴动游戏多功能都是有辅助器教程兴动游戏能透视中分为三种模型:...