迷路的机器人(递归回溯+动态规划两个方法实现)

这篇具有很好参考价值的文章主要介绍了迷路的机器人(递归回溯+动态规划两个方法实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:

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

示例:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解释: 
输入中标粗的位置即为输出表示的路径,即
0行0列(左上角) -> 0行1列 -> 0行2列 -> 1行2列 -> 2行2列(右下角)

解题思路:动态规划 

1.先找到可行的路径,不可达的坐标点 dp=0

2.如果终点的dp不为0,说明存在可达的路径

3.那么就从终点往回走,找到可以到达起点的路径,每走一步都要将坐标添加到res数组中

4.由于是从后往前的,所以要将res进行反转

源代码如下:文章来源地址https://www.toymoban.com/news/detail-659156.html

class Solution {
public:
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> res;
        if(obstacleGrid.size()==0) return res;//矩阵为空,直接返回空数组
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
        //矩阵的起点和终点不可达,则返回空数组
        if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1) return res;
        int dp[m][n];//定义动态规划数组
        dp[0][0]=1;//起点位置可达,置为1
        //先找第一列的元素是否可达
        for(int i=1;i<m;i++)
        {
            //不可达,dp置为0
            if(obstacleGrid[i][0]==1) dp[i][0]=0;
            //可达,则dp等于上一行的
            else
            {
                dp[i][0]=dp[i-1][0];
            }
        }
        //找第一行的元素
        for(int i=1;i<n;i++)
        {
            if(obstacleGrid[0][i]==1) dp[0][i]=0;
            else
            {
                dp[0][i]=dp[0][i-1];
            }
        }
        //其他剩余元素
        for(int i=1;i<m;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(obstacleGrid[i][j]==1) dp[i][j]=0;
                else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        //如果终点的dp=0,说明不能到达终点,则返回空数组
        if(dp[m-1][n-1]==0) return res;
        //以下情况是已经找到路径了,只需要把路径添加到res中
        //从后往前找可以到达的点
        int i=m-1,j=n-1;
        while(i!=0||j!=0)
        {
            res.push_back({i,j});
       		//往上走
            int up=0;
            if(i>0) up=dp[i-1][j];
            //往左走
            int left=0;
            if(j>0) left=dp[i][j-1];
            //哪个dp值不为0,则走哪个方向
            if(up>=left) i--;
            else j--;
        }
        //最后把起点添加到数组中
        res.push_back({0,0});
        //再将数组翻转,就是正确顺序了
        reverse(res.begin(),res.end());
        return res;
    }
};

 解题思路:回溯

需要注意的是,要添加一个访问数组,标记该坐标是否已经被访问过。详解看代码

源代码如下:

class Solution {
public:
    bool isfind=false;//是否已经找到路径
    void dfs(vector<vector<int>>& obstacleGrid,vector<vector<int>>& res,vector<vector<bool>>& visited,int m,int n,int i,int j)
    {
        //如果下标i和j越界
        //如果已经找到路径(isfind==true)
        //如果当前坐标有障碍物
        //如果当前坐标已访问
        //遇到以上这些情况 直接返回
        if(i<0||i>=m||j<0||j>=n||isfind||obstacleGrid[i][j]==1||visited[i][j]) return;
        //当前坐标已经到达终点,说明找到路径了
        if(i==m-1&&j==n-1)
        {
            isfind=true;//isfind置为真
            res.push_back({i,j});//将终点添加到数组中
            //并返回
            return;
        }
		//其余正常情况,每遍历一个坐标,就将该坐标标记为已访问
        visited[i][j]=true;
        res.push_back({i,j});//坐标添加到数组中
        //递归,往下走
        dfs(obstacleGrid,res,visited,m,n,i+1,j);
        //递归,往右走
        dfs(obstacleGrid,res,visited,m,n,i,j+1);
		//回溯
        if(!isfind) res.pop_back();
    }
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>> res;
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
        if(obstacleGrid.size()==0) return res;
        //标记当前坐标是否已经访问过,初始值都为false
        vector<vector<bool>> visited(m, vector<bool>(n, false));
        if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1) return res;
        dfs(obstacleGrid,res,visited,m,n,0,0);

        return res;
    }
};

到了这里,关于迷路的机器人(递归回溯+动态规划两个方法实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 动态规划算法--机器人到达指定位置的方法数量

    一、背景         暴力递归和动态规划的本质是一样的, 动态规划就是尝试减少重复计算的技巧而已 。这种技巧是一个大型套路,先写出用尝试的思路解决问题的递归函数,而不用操心时间复杂度。         动态规划的优化大致分为三个过程,第一阶段是暴力递归,

    2024年01月15日
    浏览(46)
  • 【路径规划】基于动态窗口法DWA算法的机器人动态避障路径规划研究附Matlab实现

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

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

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

    2024年04月09日
    浏览(42)
  • 算法 矩阵最长递增路径-(递归回溯+动态规划)

    牛客网: BM61 求矩阵的最长递增路径 解题思路: 1. 遍历二维矩阵每个位置,max求出所有位置分别为终点时的最长路径 2. 求某个位置为终点的最长路径时,使用动态规划dp对已经计算出的位置进行记录 3. 处理某个位置的最长路径时,如果dp[i][j]位置已有值,则直接返回即可,否则

    2024年02月07日
    浏览(41)
  • 【四旋翼飞行器】【模拟悬链机器人的动态】设计和控制由两个四旋翼飞行器推动的缆绳研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 四旋翼飞

    2024年02月05日
    浏览(39)
  • 剑指 Offer !!13. 机器人的运动范围(回溯算法)

    剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能

    2024年02月11日
    浏览(38)
  • 【MATLAB源码-第64期】matlab基于DWA算法的机器人局部路径规划包含动态障碍物和静态障碍物。

    动态窗口法(Dynamic Window Approach,DWA)是一种局部路径规划算法,常用于移动机器人的导航和避障。这种方法能够考虑机器人的动态约束,帮助机器人在复杂环境中安全、高效地移动。下面是DWA算法的详细描述: 1. 动态窗口的概念 动态窗口法的核心概念是“动态窗口”,这是

    2024年02月05日
    浏览(52)
  • 算法思想—枚举、递推、迭代、递归、分治、贪心、动态规划、回溯、模拟、分支定界

    算法思想 枚举(暴力算法) 枚举算法(暴力算法)是一种通过逐一尝试所有可能解来解决问题的算法。它的基本思想是将问题的所有可能答案一一列举出来,并根据一定的判断条件来确定哪些答案是合适的。这种算法通常使用循环来实现,因为需要尝试所有可能的情况。两

    2024年02月01日
    浏览(39)
  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

    1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构

    2024年02月08日
    浏览(43)
  • 剑指offer(C++)-JZ13:机器人的运动范围(算法-回溯)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,

    2024年02月12日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包