其他分享
首页 > 其他分享> > [Leetcode] 面试题 08.02. 迷路的机器人

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

作者:互联网

【面试题 08.02. 迷路的机器人】


  设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。
在这里插入图片描述
  网格中的障碍物和空位置分别用 1 和 0 来表示。
  返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。
示例1:

输入:
[
[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列(右下角)

说明: r 和 c 的值均不超过 100。


题意:
  一个机器人需要从一个二维矩阵的左上角走到右下角,每次只能往右或往下走,其中有障碍物(障碍物处不可通行),输出任意一条可行的路径。
思路:
  首先想到的就是用动态规划的思想来做这道题,分析如下:
(1)定义:dp[i][j]表示机器人是否能走到(i,j)位置。
(2)初始化:  
     ① dp[0][0]=1;
     ②计算首行和首列: 判断左边或者上面是否为true且当前是否有障碍;
     ③其他为false;
(3)计算:
     ①obstacleGrid[i][j] = 1的情况:dp[i][j] = 0;
     ②obstacleGrid[i][j] = 0的情况:dp[i][j] = max(d[i-1][j], d[i][j-1]) 取两种情况(左和上)的最大值。
(4)结果
     ①dp[r-1][c-1]=0:没有路径
     ②dp[r-1][c-1]=1:倒推回去求任意一条路径,无需判断最短,只要一条可以一直走下去的路径就可以。因为插入路径是倒序,最后倒序后就是结果。


代码:

class Solution {
public:
    vector<vector<int>> pathWithObstacles(vector<vector<int>>& obstacleGrid) {
        vector<vector<int>>ans;
        int row = obstacleGrid.size(); //矩阵的行
        int col = obstacleGrid[0].size();//矩阵的列
        if(row ==0||col ==0)
            return ans;
        //起点或终点是障碍的情况
        if(obstacleGrid[0][0]==1||obstacleGrid[row-1][col-1]==1)
            return ans;
        int dp[row+1][col+1];
        dp[0][0]=1;
        //处理第一列
        for(int i=1;i<row;i++){
            if(obstacleGrid[i][0]==1){
                dp[i][0]=0;
            }else{
                dp[i][0]=dp[i-1][0];
            }
        }
        //处理第一行
        for(int i=1;i<col;i++){
            if(obstacleGrid[0][i]==1)
                dp[0][i] = 0;
            else 
                dp[0][i] = dp[0][i-1];
        }
        //计算状态转移方程
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                if(obstacleGrid[i][j]==1)
                    dp[i][j]=0;
                else 
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }
        }
        //走到终点的状态是0,无路径
        if(dp[row-1][col-1] == 0) return ans;
        int r=row-1,c=col-1;
        //从终点往回走,随意找一条可行路径  
        while(r!=0 || c!=0){
            ans.push_back({r,c});
            int up=0;
            if(r>0)up=dp[r-1][c];
            int left=0;
            if(c>0)left=dp[r][c-1];
            if(up>=left)r--;
            else c--;
        }
        //把起点加进去
        ans.push_back({0,0});
        //翻转结果
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

时间复杂度: O(row*col)
空间复杂度: O(row+col)

标签:08.02,面试题,obstacleGrid,int,col,ans,Leetcode,dp,row
来源: https://blog.csdn.net/LoveHoney1314/article/details/120511983