第九章动态规划——不同路径(二)有障碍物

这篇具有很好参考价值的文章主要介绍了第九章动态规划——不同路径(二)有障碍物。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

力扣题号:63. 不同路径 II - 力扣(LeetCode)

题目描述

示例

提示

思路

解法一:动态规划

(1)dp数组的下标及其含义

(2)确定递推公式

(3)初始化递推数组

(4)确定遍历顺序

(5)根据题意推出dp数组对照

障碍物处理

代码实现

总结


力扣题号:63. 不同路径 II - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例

示例 1:

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

思路

解法一:动态规划

        这道题的思路和不同路径(1)的思路其实并没有差太多,唯一的差别就是要增加一些代码用于处理中途的障碍物,使得这些有了不同。

        

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

(1)dp数组的下标及其含义

        这里的dp[i][j] 都仍然是到达当前位置的路径数量。

(2)确定递推公式

        在确定递推公式之前我们先观察一下问题,你会发现,第一行或者第一列的每一个位置都只有一种路径到达,因此你可以选择先把第一行和第一列全部赋值为 1,那么递推公式如下:

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

也就是到达当前位置只需要左边的点和右边的点的路径的和。

(3)初始化递推数组

        在我们这里的话,初始化的内容还有一点多,就是将第一行和第一列都全部初始化为1.

(4)确定遍历顺序

        思路都如此明确了,那么这个遍历顺序肯定是,从左到右从上到下了。

(5)根据题意推出dp数组对照

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

 文章来源地址https://www.toymoban.com/news/detail-855932.html

障碍物处理

        我们这里的障碍物处理涉及到了,一开始的m,n == 1的时候和后面的处理过程中。在一开始处理m,n的时候我们判断中途是否有障碍物,如果有的话直接返回0,没有就直接返回1。

        如果是在初始化和中途的时候。先说初始化,初始化的时候我们将第一行和第一列进行遍历然后赋值为1,如果中途遇到了障碍物那么就停止赋值直接让它保持为0即可。

        在中途的时候,如果该点是障碍物,那么直接跳过这个点。如果不是,那么判断左边和上面是否有障碍物,没有的话和之前一样

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

        如果上面有障碍物,左边没有

        如果左面有障碍物,上边没有

        如果都有障碍物,直接等于0,当然了,你直接跳过这个点也可以

  or  

代码实现

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        // 获取m和n
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        // 如果只有一列,判断这一列中是否有障碍物
        // 有返回0,没有返回1
        if(n == 1 ){
            for(int i = 0;i < m;i++){
                if(obstacleGrid[i][0] == 1){
                    return 0;
                }
            }
            return 1;
        }
        // 如果只有一行,判断这一行中是否有障碍物
        // 有返回0,没有返回1
        if(m == 1){
            for(int i = 0;i < n;i++){
                if(obstacleGrid[0][i] == 1){
                    return 0;
                }
            }
            return 1;
        }
        // 定义出dp数组
        int[][] dp = new int[m][n];
        // 初始化一下dp数组
        for(int i = 0; i < m; i++){
            if(obstacleGrid[i][0] == 1){
                // 有障碍物,下面去不了
                break;
            }
            dp[i][0] = 1;
        }
        for(int i = 0; i < n; i++){
            if(obstacleGrid[0][i] == 1){
                // 有障碍物,右边去不了
                break;
            }
            dp[0][i] = 1;
        }
        // 进入dp
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                // 跳过障碍物
                if(obstacleGrid[i][j] == 1){
                    continue;
                }
                if(obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j - 1] == 1){
                    // 上边和左边都堵死了
                    dp[i][j] = 0;
                    // continue;
                }else if(obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j - 1] == 0){
                    // 左边没堵死,上边堵死了
                    dp[i][j] = dp[i][j - 1];
                }else if(obstacleGrid[i - 1][j] == 0 && obstacleGrid[i][j - 1] == 1){
                    // 左边堵死,上边没堵死
                    dp[i][j] = dp[i - 1][j];
                }else{
                    // 左边和上边都没有堵死
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        // 返回答案
        return dp[m - 1][n - 1];
    }
}

没啥难度

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

 

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣


总结

        其实这道题也就是多了障碍物的处理,只要是理解并读懂了我前一篇文章,不同的路径一,这道题应该是没有任何问题了。前一篇文章的链接在下面了:

第九章动态规划——不同路径(一)-CSDN博客

        最后,谢谢大家的观看,如果觉得满意的话,点个赞呗~~~

第九章动态规划——不同路径(二)有障碍物,我的算法记录,动态规划,算法,java,力扣

 

到了这里,关于第九章动态规划——不同路径(二)有障碍物的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apollo规划决策算法仿真调试(5):动态障碍物绕行

    Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。Apollo 自动驾驶开放平台为开发者提供了丰富的车辆、硬件选择,强大的环境感知、高精定位、路径规划、车辆控制等

    2024年02月09日
    浏览(82)
  • 【路径规划】粒子群算法求解机器人障碍物环境的Voronoi图路径规划【含GUI Matlab源码 3748期】

    粒子群算法(Particle Swarm Optimization, PSO)可以用于栅格地图上机器人的最短路径规划。在这种问题中,栅格地图被划分为离散的单元格,每个单元格可以是阻挡或可通过的区域。机器人需要从起始位置移动到目标位置,避免碰到阻挡。 PSO算法中,通过使用一群粒子来搜索最优

    2024年01月17日
    浏览(63)
  • Python 动态规划 实现机器人躲避障碍物获取最短路径

    要设计一种算法来寻找机器人从左上角移动到右下角的路径,可以使用动态规划来解决这个问题。下面是一种可能的算法: 创建一个处理机器人运动的函数 find_path ,函数接受一个矩阵 grid 作为参数,用于表示机器人移动的网格环境,该矩阵一个由 0 和 1 组成的二位列表,其

    2024年04月09日
    浏览(47)
  • 百度Apollo规划算法——OBB障碍物检测代码解析

    本文主要分析Apollo代码中函数 bool Box::HasOverlap(const Box2d box) const {} 的数学原理。 在阅读此部分代码时,第一遍没看懂return的一堆什么意思,百度之后说是采用OBB原理,所以就去了解下OBB原理,回来看还是没太明白,直到看到了博客[1],通过博主的图解才有了进一步的了解,但

    2024年02月14日
    浏览(41)
  • ros机器人在navigation下导航costmap_2d动态层(障碍物层)障碍物无法及时消除的情况解决办法

    设备 杉川-3a激光雷达 win10笔记本电脑 ubuntu18.04 ros-melodic 问题 ros机器人在move_base下导航,有静态图层与动态图层,静态图层显示之前已经建立好的地图,而动态层显示现在激光雷达实时扫描到的障碍物。 假设机器人雷达最大范围为8m,在某一时刻,以机器人为原点,在机器人

    2024年02月06日
    浏览(47)
  • ROS从入门到精通2-7:Gazebo仿真之动态生成障碍物

    本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 🚀详情:《ROS从入门到精通》 动态生成障碍物在机器人工程领域应用非常广泛,例如 机器人导航与路径规划 :动态生成障碍物可以用于评估

    2024年02月11日
    浏览(296)
  • 从零开始的三维激光雷达SLAM教程第二讲(搭建Gazebo仿真环境,并添加动态障碍物)

    毕业设计打算做三维激光SLAM,记录一些学习历程,也给后面人一点帮助。本教程不涉及SLAM基本概念(如果没有自行补充),主要包含以下几部分内容。 搭建激光SLAM的运行环境并运行数据集 在Gazebo中构建仿真地图并添加动态障碍物,使用仿真小车采集激光数据。 A-LOAM详解,

    2024年02月01日
    浏览(50)
  • 【论文阅读】点云地图动态障碍物去除基准 A Dynamic Points Removal Benchmark in Point Cloud Maps

    终于一次轮到了讲自己的paper了 hahaha,写个中文的解读放在博客方便大家讨论 Title Picture Reference and prenotes paper: https://arxiv.org/abs/2307.07260 code: https://github.com/KTH-RPL/DynamicMap_Benchmark b站:地图动态障碍物去除总结 ITSC’23: A Dynamic Points Removal Benchmark in Point Cloud Maps 主要就是2019年末

    2024年02月06日
    浏览(41)
  • unity-障碍物和空气墙的设置

    建个游戏对象,然后给他添加2d碰撞盒子属性 把它放到相机下面,让它成为相机的所属的子组,跟随相机一起移动通过。 创建新的标签便于碰撞确认操作。 ** ** 判断我们游戏操控的物体是否在空气墙上: 额外 : 可以被跨越一类的物体的判断(地刺一类) ​ 其实步骤都和上

    2024年02月13日
    浏览(55)
  • Fluent案例1- 空气流经障碍物-3D模拟

    目录 1. 构建几何模型 2. 生成网格  2.1 生成六面体网格 2.2 生成四面体网格 2.3 生成多面体网格 3. 模拟设置 4. 后处理 4.1 查看不同网格下的压力与速度分布 4.2  查看wall上压力分布 5. 总结  前面的博客介绍了2D的模拟操作步骤,接下来进行3D的建模与计算 将之前建好的2D模型导

    2024年02月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包