文章目录
- 系列文章目录
- 一、一般性矩阵寻多种最短路径问题
- 传送门:各种迷宫寻路径问题(一)_躺平的小智的博客-CSDN博客
- 二、一般性迷宫问题 加强版
- 传送门:各种迷宫寻路径问题(二)_躺平的小智的博客-CSDN博客
- 三、一般性迷宫问题 加强版(二)
- 传送门:各种迷宫寻路径问题(三)_躺平的小智的博客-CSDN博客
- 四、有障碍,任意走的基础迷宫最短路径问题
- 传送门:各种迷宫问题(四)_躺平的小智的博客-CSDN博客
- 五、矩阵中寻找特殊元素路径
- 传送门:各种迷宫问题(五)_躺平的小智的博客-CSDN博客
- 六、矩阵中寻找特殊元素路径(二)
- 传送门:各种迷宫问题(六)_躺平的小智的博客-CSDN博客
- 七、美团力扣周赛
- 传送门:美团迷宫问题_躺平的小智的博客-CSDN博客
- 八、滴滴秋招笔试题
- 传送门:滴滴迷宫笔试题_躺平的小智的博客-CSDN博客
二、一般性矩阵寻多种最短路径问题 升级版(有障碍,无钥匙,右下走,损耗相同)
这种问题在(一)的基础上,加了有障碍物这个条件
- 我们在(一)的条件下,只要加上判断条件即可,有障碍物的情况下,我们另dp数组为0,无障碍的情况下,在对dp数组赋值为1。当然这里需要我们注意一点,当第一行或者第一列中某个路不通时,我们另后面的所有dp值都为0,因为前面的路不通了,后面的路一定不同。
如下面一维迷宫中:
0 | 1 | 0 | 0 | 0 |
dp值为:
1 | 0 | 0 | 0 | 0 |
还需要注意的一点是,当(0,0)处也就是起点处有障碍物时,直接返回0。
代码如下:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
if(obstacleGrid[0][0]==1) return 0;
for(int i =0;i<m;++i){
if(obstacleGrid[i][0]==0) dp[i][0]=1;
else break;
}
for(int j = 1;j<n;++j){
if(obstacleGrid[0][j]==0) dp[0][j]=1;
else break;
}
if(m==1){
for(int j =0;j<n;++j){
if(dp[0][j]==0) return 0;
}
return 1;
}
if(n==1){
for(int i = 0;i<m;++i){
if(dp[i][0]==0) return 0;
}
return 1;
}
for(int i =1;i<m;i++){
for(int j = 1;j<n;j++){
if(obstacleGrid[i][j]==0) dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};