题目叙述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
分析
在原来的62题的基础上进行加了一些障碍点。本题同时也要注意一些边界问题。比如如果起点和终点就是障碍点的话,那么问题的答案直接就可以进行返回为0。
代码
class Solution {
public:
int dfs(vector<vector<int>>& obstacleGrid, vector<vector<int> >& dp, int x, int y){
if(x<0 || y<0 || x>obstacleGrid.size() || y>obstacleGrid[0].size()){
return 0;
}
if(x==0 && y==0){
dp[0][0] = 1;
return 1;//收敛条件
}
if(obstacleGrid[x][y]==1) return 0;
if(dp[x][y]!=-1) return dp[x][y];
int ans = dfs(obstacleGrid, dp, x-1, y) + dfs(obstacleGrid, dp, x, y-1);
dp[x][y] = ans;
return dp[x][y];
}
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
//为防止超时,使用记忆化递归
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
if(obstacleGrid[m-1][n-1]==1 || obstacleGrid[0][0]==1) return 0;
vector<vector<int> > dp(m, vector<int>(n, -1));
//dp[m-1][n-1] = 0;
dfs(obstacleGrid, dp, m-1, n-1);
//在原来的无障碍的基础上加上一层判断
return dp[m-1][n-1];
}
};