一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑?
說明:m?和 n 的值均不超過 100。
示例?1:
輸入:
[
??[0,0,0],
??[0,1,0],
??[0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
和不同路徑那道題是一樣的,只不過需要加上障礙判斷.?
public int uniquePathsWithObstacles(int[][] obstacleGrid) {int row = obstacleGrid.length;int col = obstacleGrid[0].length;// 考慮終點是否是障礙物if (obstacleGrid[row - 1][col - 1] == 1) {return 0;}// 初始化最后一行和最后一列int[][] memo = new int[row][col];memo[row - 1][col - 1]= 1;for (int i = row - 2;i >= 0; i --) {if (obstacleGrid[i][col - 1] != 1) {memo [i][col - 1] = memo[i + 1][col - 1];}}for (int i = col - 2; i >= 0; i --) {if (obstacleGrid[row - 1][i] != 1) {memo[row - 1][i] = memo[row - 1][i + 1];}}for (int r = row - 2; r >= 0; r --) {for (int c = col -2; c >= 0; c --) {if (obstacleGrid[r][c] != 1) { // 注意障礙物memo[r][c] = memo[r][c + 1] + memo[r + 1][c];}}}return memo[0][0];}