一、题目描述
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 Paths” 这道题的思想,不过设置了障碍之后,对于第一行和第一列要单独拿出来处理。用path[i][j] 表示到[i][j]位置的路径的条数,先判断[i][j]位置是否是障碍,即值是否是1,如果是障碍,那么path[i][j]=0,否则用状态转换方程path[i][j] = path[i-1][j] + path[i][j-1]
c++代码(3ms,26.70%)
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m,n;
m = obstacleGrid.size();
n = obstacleGrid[0].size();
int i,j;
int path[m][n];
path[0][0] = obstacleGrid[0][0]==0?1:0;
for(i=1; i<n;i++){ //先处理第一行
if(obstacleGrid[0][i] == 1){
path[0][i]=0;
}else{
path[0][i] = path[0][i-1];
}
}
for(i=1;i<m;i++){ //处理第一列
if(obstacleGrid[i][0] == 1){
path[i][0] = 0;
}else{
path[i][0] = path[i-1][0];
}
}
for(i=1;i<m;i++){
for(j=1;j<n;j++){
if(obstacleGrid[i][j] == 1){
path[i][j]=0;
}else{
path[i][j] = path[i-1][j] + path[i][j-1];
}
}
}
return path[m-1][n-1];
}
};
c++代码2(3ms)
往外扩展一行一列,左上角位置从1,1开始。这样对于第一行第一列就不需要单独拿出来讨论了。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m,n;
m = obstacleGrid.size();
n = obstacleGrid[0].size();
int i,j;
vector<vector<int> > path(m+1, vector<int>(n+1, 0));
path[0][1] = 1;
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
if(!obstacleGrid[i-1][j-1]){
path[i][j] = path[i-1][j] + path[i][j-1];
}
}
}//for
return path[m][n];
}
};