题目描述
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
Example 1:
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1.Right -> Right -> Down -> Down
2.Down -> Down -> Right -> Right
分析
这道题的目的是求有多少条路径可以从左上角出发到达右下角,可以采用动态规划的方法。
对于其中一个点 grid[i][j] 当这个点没有障碍物,想要到达这个点只能从 grid[i][j-1] 向右走,或从grid[i-1][j] 向下走,所以到达这个点的方法有 grid[i][j-1] + grid[i-1][j] 种,当这个点有障碍物则为 0 种。
最终结果
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> count(m, vector<int>(n, 0));
for (int i = 0; i < m && obstacleGrid[i][0] != 1 ; i++) {
count[i][0] = 1;
}
for (int j = 0; j < n && obstacleGrid[0][j] != 1 ; j++) {
count[0][j] = 1;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (obstacleGrid[i][j] == 0) {
count[i][j] = count[i-1][j] + count[i][j-1];
} else {
count[i][j] = 0;
}
}
}
return count[m-1][n-1];
}
};