接上一题Unique Paths,这里增加了有障碍的情况。其实也很好理解。对于数组中不是边界的情况,原本d[i][j]等于来自上方和左边两个的和,如果上面是障碍,则从上面来的路径数为0,左边类似。不同的是,边界中原本路径数为1,如果边界中有障碍,障碍后面的都为0。需要注意的是,存在起点有障碍和终点有障碍的情况。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
int d[m][n];
if(obstacleGrid[m - 1][n - 1] == 1)return 0; //终点可能是障碍
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; j++){
if(i == 0 && j == 0)d[i][j] = obstacleGrid[0][0] == 1? 0: 1;//起点可能是障碍
//边界情况,不在乎障碍处的值,因为不会用到
else if(i == 0 && j != 0){
d[i][j] = obstacleGrid[i][j - 1] == 1? 0: d[i][j - 1]; //这里不直接赋1,可以免去检查前面是否有障碍
}
else if (j == 0 && i != 0)
{
d[i][j] = obstacleGrid[i - 1][j] == 1? 0: d[i - 1][j];
}
else {
int up = obstacleGrid[i - 1][j] == 1? 0: d[i - 1][j];
int left = obstacleGrid[i][j - 1] == 1? 0: d[i][j - 1];
d[i][j] = up + left;
}
}
}
return d[m - 1][n - 1];
}
};