设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/robot-in-a-grid-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:
(1)首先判断机器人能否到达终点,从终点开始往机器人方向前行,每次只能向上或者向左走一步,将从终点到起点的所有能走通的位置标记为2。
(2)从起点向下或者向右选择位置数据为2的点进行前进,每次将位置索引放进列表中,直到到达终点。

具体Python代码如下:

class Solution:def pathWithObstacles(self, obstacleGrid: List[List[int]]) -> List[List[int]]:if not obstacleGrid:  # 如果地图为空,则返回空列表return []rows = len(obstacleGrid)  # 计算地图长度cols = len(obstacleGrid[0])if obstacleGrid[0][0]==1 or obstacleGrid[rows-1][cols-1]==1:  # 如果起点和终点是障碍,直接返回return []obstacleGrid[rows-1][cols-1] = 2  # 将终点作为起点,标记为2,表示可以到达for i in range(rows-2,-1,-1):    # 判断最后一列,从下往上终点能够到达的地方if obstacleGrid[i+1][cols-1] == 2 and obstacleGrid[i][cols-1]!=1:obstacleGrid[i][cols-1] = 2for i in range(cols-2,-1,-1):    # 判断最后一行,从右往左终点能到达的最远位置if obstacleGrid[rows-1][i+1] == 2 and obstacleGrid[rows-1][i]!=1:obstacleGrid[rows-1][i] = 2for i in range(rows-2,-1,-1):    # 判断能否从终点返回起点for j in range(cols-2,-1,-1):if (obstacleGrid[i+1][j]==2 or obstacleGrid[i][j+1]==2) and obstacleGrid[i][j]!=1:obstacleGrid[i][j] = 2if obstacleGrid[0][0]!=2:    # 如果起点的数值不是2,说明终点不能返回起点,障碍物挡住了,返回空列表return []nr = 0nc = 0index = [[nr,nc]]    # 从起点搜索到终点,看该点下面或右边是否存在值为2的点while nr<rows and nc<cols:if nr+1<rows and obstacleGrid[nr+1][nc]==2:index.append([nr+1,nc])nr+=1elif nc+1<cols and obstacleGrid[nr][nc+1]==2:index.append([nr,nc+1])nc+=1else:    # 如果其右边或者下面都不是2,说明障碍物挡住了,直接结束循环breakif nr==rows-1 and nc==cols-1:    # 如果可以到达终点,返回列表路径return indexreturn []    # 否则返回空列表

面试题 08.02. 迷路的机器人相关推荐

  1. [Leetcode] 面试题 08.02. 迷路的机器人

    [面试题 08.02. 迷路的机器人]   设想有个机器人坐在一个网格的左上角,网格 r 行 c 列.机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物).设计一种算法,寻找机器人从左上角 ...

  2. 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 动态规划 1. 题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列. 机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍 ...

  3. Leetcode每日一题:面试题 08.02. 迷路的机器人

    思路:深度优先搜索:设立一个全局变量flag,一旦找到终点,便将flag置为true,防止其进一步寻求多条路径: 加visited时,很多人选择new一个二维数组出来,然而这里我们只需将已被试过无法到 ...

  4. 阿里开发者招聘节 | 面试题08:NAS(Network Attached Storage)协议NFS和SMB相关问题

    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总 ...

  5. python【力扣LeetCode算法题库】面试题 08.11- 硬币

    面试题 08.11. 硬币 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = ...

  6. LeetCode 面试题 10.02. 变位词组

    面试题 10.02. 变位词组 Ideas 互为变位词的两个字符串包含的字符相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,可以将排序之后的字符串作为哈希表的键. 在Python里面有 ...

  7. [Leedcode][JAVA][面试题 08.11][硬币][动态规划]

    [问题描述] 面试题 08.11.硬币 硬币.给定数量不限的硬币,币值为25分.10分.5分和1分,编写代码计算n分有几种表示法.(结果可能会很大,你需要将结果模上1000000007)示例1:输入: ...

  8. 面试题 03.02. 栈的最小值

    面试题 03.02. 栈的最小值 思路:两个栈,一个存数据,一个存当前最小值 class MinStack { public:stack<int> s1;stack<int> ...

  9. LeetCode 面试题 08.01. 三步问题 (动态规划)

    面试题 08.01. 三步问题 解法1(动态规划) 分析出递推式:f(n) = f(n - 1) + f(n - 2) + f(n - 3) class Solution {public int wa ...

最新文章

  1. JavaScript高级程序设计(1)
  2. python官网支持货到付款吗_官网购买的iPhone12pro还没发货?试着用Python快速入手...
  3. C++编程基础一 06-布尔类型
  4. 软件工程复习提纲——第四章
  5. 初学者应该怎么学习前端?web前端的学习路线大剖析
  6. Unity UGUI优化:解决EventSystem耗时过长的问题 第一部分
  7. linux解压缩及源码安装
  8. Java核心技术11 | Java IO
  9. cad画固定长度的弧线_CAD绘制指定长度的圆弧的2种方法
  10. Xpath--使用Xpath爬取糗事百科成人版图片
  11. redis 学习笔记
  12. 网页audio标签中autoplay自动播放音乐失败解决方案
  13. 录屏 java_Java小程序—录屏小程序(上半场)
  14. 【校内模拟】简单粗暴的题目(二项式展开)
  15. 殇城的伤感心情日志分享:青春容颜,我却一笔流伤
  16. 7 款优秀 Markdown 编辑工具推荐
  17. python将多个表的数据合并到一个表
  18. 复盘港股2021:新股上市热潮不减,市场重现“冰火两重天”
  19. DB2使用特殊分隔符处理数据
  20. 【Apache Spark 】第 5 章Spark SQL 和 DataFrames:与外部数据源交互

热门文章

  1. 苹果黑色星期五大促销活动全球上线
  2. CSS性能优化:可以试一试内联CSS?
  3. Hibernate一对多映射示例注释
  4. Django---启动admin的报no such table: auth_user错误
  5. 2019/12/11学习内容摘要(Linux系统用户与用户组管理①)
  6. PHP webshell
  7. 【New】简•导航 正式上线
  8. C#开发笔记之19-如何用C#实现优雅的Json解析(序列化/反序列化)方案?
  9. C#LeetCode刷题之#453-最小移动次数使数组元素相等(Minimum Moves to Equal Array Elements)
  10. 事务处理与事务的隔离级别