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

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

目录

力扣题号: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日
    浏览(37)
  • 【路径规划】粒子群算法求解机器人障碍物环境的Voronoi图路径规划【含GUI Matlab源码 3748期】

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

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

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

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

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

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

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

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

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

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

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

    2024年02月01日
    浏览(36)
  • 【论文阅读】点云地图动态障碍物去除基准 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日
    浏览(31)
  • 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日
    浏览(43)
  • unity-障碍物和空气墙的设置

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

    2024年02月13日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包