不同路径-有障碍
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths-ii
注:题目的数组中有障碍为1,没有障碍为0
思路:
首先边界值的问题,第一行和第一列只能为1,因为只有一条路可以走
边界:dp[i][0] = 1;dp[0][i] = 1;
如果有障碍那么在这个障碍以后的都不可达
// 第一行只能往右走为1,遇到障碍物后面都为0for(int i = 0;i<n&&obstacleGrid[0][i]==0;i++){dp[0][i] = 1; //第一行能够通行的为1;}// 第一列for(int i = 0;i<m&&obstacleGrid[i][0]==0;i++){dp[i][0] = 1;}
中间路径:然后从小扩展到大来看,每一个位置只能从它的上面或者他的左边来。<br />从左上角到右下角,也就是dp[i-1][j]+dp[i][j-1]的组合。<br />扩大一点可以看出确实是这个意思。<br /> 有障碍表示此路不通,也不可达直接为0,也就是不改变值。
for(int i = 1;i<m;i++){for(int j =1;j<n;j++){if(obstacleGrid[i][j]==0){// 等于0表示可以通行dp[i][j] = dp[i-1][j]+dp[i][j-1];}}}
代码
class Solution {// 遇到障碍为0public int uniquePathsWithObstacles(int[][] obstacleGrid) {if(obstacleGrid.length == 0) return 0;int m = obstacleGrid.length,n = obstacleGrid[0].length;int[][] dp = new int[m][n];// 第一行只能往右走为1,遇到障碍物后面都为0for(int i = 0;i<n&&obstacleGrid[0][i]==0;i++){dp[0][i] = 1; //第一行能够通行的为1;}// 第一列for(int i = 0;i<m&&obstacleGrid[i][0]==0;i++){dp[i][0] = 1;}for(int i = 1;i<m;i++){for(int j =1;j<n;j++){if(obstacleGrid[i][j]==0){// 等于0表示可以通行dp[i][j] = dp[i-1][j]+dp[i][j-1];}}}return dp[m-1][n-1];}}
