不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

示例 1:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

 

 

解决思路:

相比于上节内容,本题网格中存在障碍物,故需要额外考虑两点。

1,若最下面一行中某个网格存在障碍物,则该网格的前面网格都无法到达end;

         
         
0 0 障碍物 1 end

(网格[2][2]存在障碍物,则网格[2][0]与[2][1]均不可达end)

 

2,对于网格a,到达end要么通过b,要么通过c,故a到end的总路径

paths(a) = 0,如果a处存在障碍物;

paths(a) = paths(b) + paths(c),如果a处不存在障碍物。

 

 

实现代码:

先将网格的最下面一行与最右面一列填写完成,在填写其它网格。

    public static int test(int[][] obstacleGrid) {

        boolean lastLine = false;
        int M = obstacleGrid.length;
        int N = obstacleGrid[0].length;

        for (int j=N-1; j>=0; j--) {
            lastLine = obstacleGrid[M-1][j]==1?true:lastLine;
            obstacleGrid[M-1][j] = lastLine?0:1;
        }

        for (int i=M-2; i>=0; i--)
            obstacleGrid[i][N-1] = obstacleGrid[i][N-1]==1?0:obstacleGrid[i][N-1]+obstacleGrid[i+1][N-1];


        for (int j=N-2; j>=0; j--)
            for (int i=M-2; i>=0; i--)
                obstacleGrid[i][j] = obstacleGrid[i][j]==1?0:obstacleGrid[i+1][j]+obstacleGrid[i][j+1];

        return obstacleGrid[0][0];
    }

 

posted on 2018-05-16 19:26  Deltadeblog  阅读(147)  评论(0编辑  收藏  举报

导航