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]; } };