题目描述:
一个机器人位于一个m*n网格的左上角(起始点在start位置),机器人每次都只能向下或者向右移动。机器人试图达到目的地(finish)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径。
题目解析:
该题与前面一题异曲同工,唯一的差别在于如何将障碍物这条路径排除在外。首先我们还是要找出递推公式:
在开始位置时,只有一条路径;当在第一行或者第一列时,路径数目与前一个状态相同。其余则是左边+上边路径数目。
class Solution{
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid){
int m=obstacleGrid.size();
if(m<1) return 0;
int n=obstacleGrid[0]().size();
if(n<1) return 0;
long dp[m][n]; //这里采用long型整数
if(obstacleGrid[0][0]==1) return 0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
{
if(i==0&&j==0) dp[i][j]=1;
else if(i==0&&j!=0) dp[i][j]=(obstacleGrid[i][j]==1?0:dp[i][j-1]);
else if(i!=0&&j==0) dp[i][j]=(obstacleGrid[i][j]==1?0:dp[i-1][j]);
else dp[i][j] = (obstacleGrid[i][j]==1?0:(dp[i-1][j]+dp[i][j-1]));
}
}
return static_cast<int>(dp[n-1][m-1]);
}
};