思路同 LeetCode 61. Unique Path —— “从原点出发,只能向右或向下移动,用vt[n][m]记录可达路径的数目。
对于点阵中的任一点(i, j), 它可达路径的数目vt[i][j] = vt[i-1][j] + vt[i][j-1]. 即它上方那点可达路径数目加上其左边那点可达路径数目。”
只是当(i, j)左边或右边的点为障碍物时,不能再加上该点可达路径数目。
代码:
class Solution
{
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid)
{
auto vt = obstacleGrid; // just declare a virable
vt[0][0] = 1 - obstacleGrid[0][0];
for (int i = 1; i < vt[0].size(); ++ i)
{
vt[0][i] = (1-obstacleGrid[0][i-1]) * vt[0][i-1];
}
for (int i = 1; i < vt.size(); ++ i)
{
vt[i][0] = (1-obstacleGrid[i-1][0]) * vt[i-1][0];
}
for (int i = 1; i < vt.size(); ++ i)
{
for (int j = 1; j < vt[0].size(); ++ j)
{
vt[i][j] = (1-obstacleGrid[i-1][j])*vt[i-1][j] + (1-obstacleGrid[i][j-1])*vt[i][j-1];
}
}
return (1-obstacleGrid[vt.size()-1][vt[0].size()-1]) * vt[vt.size()-1][vt[0].size()-1];
}
};