分析:只有①和②这两条可能的道路,因为中间的大石头给挡住了
由上一个贴子可知:
LeetCode Hot100 62. 不同路径_FlowShip的博客-优快云博客https://blog.youkuaiyun.com/FlowShip/article/details/121984508下一个格子到达的可能性肯定是上两个格子能到达的可能性相加
所以在没有障碍的62题 基础上加上判断即可,即遇到障碍就跳过当前的障碍,不继续遍历。
解题步骤:
1.由题意得,这个网格是个 m = obstacleGrid.length 行
n = obstacleGrid[0].length 列
2.初始化单行单列的情况
例如:
所以单行单列的只要不碰到石头之前可到的路径都是 1
即:
obstacleGrid[X][X] != 1 表示没碰到石头
for (int i = 0; i < lie && obstacleGrid[0][i] != 1; i++) {//横着的长条初始化 dp[0][i] = 1; } for (int i = 0; i < hang && obstacleGrid[i][0] != 1; i++) {//竖着的单列初始化 dp[i][0] = 1; }
3.开始进行所有网格的 从左上到右下的遍历 即 i=1,2,3,...,m-1 , j=1,2,3,....,n-1
public static int uniquePathsWithObstacles(int[][] obstacleGrid) {
int hang = obstacleGrid.length;//有多少行
int lie = obstacleGrid[0].length;//有多少列
int[][] dp = new int[hang][lie];
for (int i = 0; i < hang && obstacleGrid[i][0] != 1; i++) {//竖条
dp[i][0] = 1;
}
for (int i = 0; i < lie && obstacleGrid[0][i] != 1; i++) {//横条
dp[0][i] = 1;
}
for (int i = 1; i < hang; i++) {
for (int j = 1; j < lie; j++) {
if (obstacleGrid[i][j] == 1) {//碰到石头了就不走了
continue;
}
//当前的格子可达路径数 = 上面的格子可达路径数 + 左面的格子可达路径数
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[hang-1][lie-1];
}
本题类似题目:
LeetCode Hot100 62. 不同路径_FlowShip的博客-优快云博客
https://blog.youkuaiyun.com/FlowShip/article/details/121985491