在《矩形格路径的个数 Unique Paths》中,介绍了求解矩阵格路径个数的两种方法,这种属于没有阻碍的路径个数。本文要处理的问题是,如果人为的在矩阵的某些格子中布置障碍物,意味着不能通过该格子。那么格路径的个数如何求解。
思路:该问题仍然具有子问题。还是可以采用动态规划方法。
设置状态量H[][],H[i][j]表示从A[0][0]格子到A[i][j]格子的路径个数。
递推关系:
如果A[i][j]=1,那么无论如何也到达不了它。
如果A[i][j]=0,那么要看它的左边和上面。
若A[i-1][j]=1, A[i][j-1] =1 ,那么H[i][j] = 0
若A[i-1][j]=0, A[i][j-1] =1 ,那么H[i][j] = H[i][j-1]
若A[i-1][j]=1, A[i][j-1] =0 ,那么H[i][j] = H[i-1][j]
若A[i-1][j]=0, A[i][j-1] =0 ,那么H[i][j] = H[i-1][j] + H[i][j-1]
初始条件是H[0][0] = 1
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int row = obstacleGrid.size();
if(row == 0)
return 0;
int col = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1) //出发点就是障碍
return 0;
int **H = new int *[row];
for(int i=0;i<row;i++)
H[i] = new int[col];
H[0][0] = 1;
for(int i=1;i<row;i++)
{
if(obstacleGrid[i][0] == 0)
H[i][0] = H[i-1][0];
else
H[i][0] = 0;
}
for(int j=1;j<col;j++)
{
if(obstacleGrid[0][j] == 0)
H[0][j] = H[0][j-1];
else
H[0][j] = 0;
}
for(int i=1;i<row;i++)
for(int j=1;j<col;j++)
{
if(obstacleGrid[i][j] == 1)
{
H[i][j] = 0;
continue;
}
if(obstacleGrid[i-1][j] == 0)
{
if(obstacleGrid[i][j-1] == 0)
H[i][j] = H[i-1][j] + H[i][j-1];
else
H[i][j] = H[i-1][j];
}
else
{
if(obstacleGrid[i][j-1] == 0)
H[i][j] = H[i][j-1];
else
H[i][j] = 0;
}
}
int sum = H[row-1][col-1];
for(int i=0;i<row;i++)
delete[] H[i];
delete[] H;
return sum;
}
};