Unique Paths II
Follow up for "Unique Paths":
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.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is 2
.
Note: m and n will be at most 100.
解题技巧:
该题的做法和Unique PathII的基本相同,需要进行一些特殊处理:
1.当obstacleGrid[i][j] = 1时,表示无法到达这个点,故A[i][j] = 0
2.当obstacleGrid[i -1][j] = 1时,表示无法从点(i - 1, j)到达点(i , j),故A[i][j] = A[i][j-1]
当obstacleGrid[i][j -1] = 1时,表示无法从点(i, j - 1)到达点(i , j),故A[i][j] = A[i-1][j]
因此状态转移方程可写成:A[i][j] = (1-obstacleGrid[i - 1][j] ) * A[i -1][j] + (1 - obstacleGrid[i][j - 1]) * A[i][j - 1]
代码:
int uniquePathsWithObstacles(vector< vector<int> >& obstacleGrid)
{
int m, n, flagx = 0, flagy = 0;
m = obstacleGrid.size();
n = obstacleGrid[0].size();
int A[m][n];
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < n; j ++)
{
if(obstacleGrid[i][j])
{
A[i][j] = 0;
if (i == 0 && j == 0) return 0;
}
else if(i == 0 && j == 0)
{
A[i][j] = 1;
}
else if(i == 0)
{
A[i][j] = A[i][j-1];
}
else if(j == 0)
{
A[i][j] = A[i-1][j];
}
else A[i][j] = (1-obstacleGrid[i-1][j]) * A[i-1][j] + (1 - obstacleGrid[i][j-1]) * A[i][j-1];
}
}
return A[m-1][n-1];
}