不同路徑II(一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。 現在考慮網格中有障礙物。那么從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。)


示例 1:

輸入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

思路分析這個問題和上一篇路徑題的分析一樣,不同之處在於,加了障礙物。那么我們可以重新定義一個二維數組,用來返回路徑數,具體思路見代碼注釋。
public static int uniquePathsWithObstacles(int[][] arr) { int m = arr.length; int n = arr[0].length; //如果起始位置和終點位置為1,直接返回0
        if(arr[0][0] == 1 || arr[m-1][n-1] == 1) return 0; //如果m == 1,判斷第m-1行是不是有1,有1直接返回0,否則返回1
        if(m == 1) { for(int j = 1;j<n;j++) { if(arr[0][j] == 1) return 0; } return 1; } //如果n == 1,判斷第n-1列是不是有1,有1直接返回0,否則返回1
        if(n == 1) { for(int i = 1;i < m;i++) { if(arr[i][0] == 1) return 0; } return 1; } //定義和輸入數組arr一樣大小的數組,作為判斷
        int[][] array = new int[m][n]; for(int j = 1;j<n;j++) { //判斷arr[0][j]是否等於1,如果不等於1,那么array[0][j]等於0,如果等於1, //從j列開始到j<n,array[0][j]全部賦值為0
            if(arr[0][j] == 0) { array[0][j] = 1; }else { for(int k = j;k<n;k++) { array[0][k] = 0; } break; } } for(int i = 1;i<m;i++) { //判斷arr[i][0]是否等於1,如果不等於1,那么array[i][0]等於0,如果等於1, //從i行開始到i<m,array[i][0]全部賦值為0
            if(arr[i][0] == 0) { array[i][0] = 1; }else { for(int k = i;k<m;k++) { array[k][0] = 0; } break; } } for(int i = 1;i<m;i++) { for(int j = 1;j<n;j++) { //如果arr[i][j] == 1,array = 0,否則array[i][j] = array[i-1][j] + array[i][j - 1]
                if(arr[i][j] == 0) { array[i][j] = array[i-1][j] + array[i][j - 1]; } } } //返回數組array最后一個數
        return array[m-1][n-1]; }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM