題目描述: 給定一個 m x n 大小的整數2D陣列 grid,有個機器人為位在網格最左上角 (grid[0][0]),機器人想要移動到最右下角 (grid[m-1][n-1])。機器人每次可以選擇往下或是往右邊移動。網格中某些格子有障礙物,有障礙物的那格會被標注 1,如果沒有障礙物則是標注 0,機器人移動的路線中不能包含任何障礙物。 題目要求回傳機器人可以走的所有唯一的路徑數量。
classSolution { public: vector<vector<int>> dp; inthelper(vector<vector<int>>& obstaclesGrid, int x, int y){ int m = obstaclesGrid.size(); int n = obstaclesGrid[0].size(); if(x >= m || y >= n || obstaclesGrid[x][y] == 1) { return0; } if(x == m-1 && y == n-1){ return1; } if(dp[x][y] != INT_MIN) return dp[x][y];
// Move to the next square int r1 = helper(obstaclesGrid, x+1, y); int r2 = helper(obstaclesGrid, x, y+1); dp[x][y] = r1+r2; return dp[x][y]; }
主要程式邏輯會是在 helper 裏面,參數 x 和 y 是用於紀錄當前是表格中哪一行哪一列。在函數中首先定義了 base case,如果到達最右下角的那格,就回傳 1 代表這一是一條有效的路徑。 另外當 x 或者 y 加超過了陣列範圍或者是遇到障礙物 obstaclesGrid[x][y] == 1 則返回 0,代表是無效路徑。
1 2 3 4
int r1 = helper(obstaclesGrid, x+1, y); int r2 = helper(obstaclesGrid, x, y+1); dp[x][y] = r1+r2; return dp[x][y];
接著上面這段代表,每一格中都可以選擇往右(y+1)或往下(x+1)走, 但不管哪一種走法,其加總就會是當前為止有的有效路徑數量 ,然後記錄到用於紀錄重複計算的 dp 中,最後回傳 dp[x][y]。在函數 uniquePathsWithObstacles 先初始化了 dp 為 m x n 大小的二維陣列,其初始值為 INT_MAX。在 helper 中如果 dp[i][j] 不為 INT_MAX 就代表已經計算過了,就直接回傳對應值即可。