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

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

輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1
提示:
m == obstacleGrid.lengthn == obstacleGrid[i].length1 <= m, n <= 100obstacleGrid[i][j] 為 0 或 1
題解
思路:
- 動態規劃
- 終點位置可以從上面過來或者從左邊過來,所以計算從上面過來的路徑數+從左邊過來的路徑數就可以得到總的路徑數,
- 特殊判斷第一行和第一列,因為這兩個位置只有一種走的方案,即第一行只能從左邊過來,第一列只能從上面過來,
- 特判有障礙的位置,有障礙的位置是無法到達的,所以初始化第一行和第一列的時候只需要初始化不為1的部分,而且一旦遇到障礙,障礙后面的位置均為0.
code:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid.size();
int m = obstacleGrid[0].size();
int f[n + 10][m + 10];
memset(f, 0, sizeof f);
// 當不滿足判斷條件i < n && obstacleGrid[i][0] == 0時,跳出回圈
// 這樣一旦遇到障礙,后面的值還是0,只初始化障礙前的位置為1
for (int i = 0; i < n && obstacleGrid[i][0] == 0; i ++){
f[i][0] = 1;
}
for (int j = 0; j < m && obstacleGrid[0][j] == 0; j ++){
f[0][j] = 1;
}
for (int i = 1; i < n; i ++){
for (int j = 1; j < m; j ++){
// 如果當前位置不是障礙則可以進行計算
// 如果是障礙,則不計算,默認還是0,即沒有方案到達
if (obstacleGrid[i][j] == 0){
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
}
return f[n - 1][m - 1];
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/508098.html
標籤:其他
上一篇:MFC第2天——繪制太極圖
下一篇:Java 中HashMap 詳解
