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 Path中用到的排列组合技巧了,似乎必须做图搜索了?
其实给定左上角的点的Path值为1(假设这个点没有被放障碍物的话),那么到达其他任何一个点的可能路径有:
if blocked
0
else
path_from_left + path_from_top
也就是说,只要不被放上障碍物,那么可能路径为左边方格的值和上面方格的值的和,否则是0。据此可以填表,表格不需要重新申请内存,直接覆盖原来的网格数据即可。
题解:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
const size_t RR = obstacleGrid.size();
const size_t CC = obstacleGrid[0].size();
// fill up the grid system
for(size_t r = 0; r < RR; ++r)
for(size_t c = 0; c < CC; ++c)
{
if (obstacleGrid[r][c] == 1)
// blocked...
obstacleGrid[r][c] = 0;
else if (r == 0 && c == 0)
// starting point
obstacleGrid[r][c] = 1;
else {
int right_ways = (c == 0 ? 0 : obstacleGrid[r][c-1]);
int top_ways = (r == 0 ? 0 : obstacleGrid[r-1][c]);
obstacleGrid[r][c] = right_ways + top_ways;
}
}
return obstacleGrid[RR - 1][CC - 1];
}
};