在一的基础上增加了障碍:
思路一样,状态转移方程不变,但是要改变转移的条件。
为了便于计算,障碍物赋值-1
情况一:边界处理
当边界中含有障碍物时,那么障碍物以后的位置都要赋值-1,不可达。
情况二:中间
当不在边界上时,计算经过每一个位置的路径M【i】【j】时,需要注意,当M【i-1】【j】和M【i】【j-1】都不为-1的时,它两的和才赋值给M【i】【j】;只要它两中有一个为-1,那么就把另一个的值赋值给M【i】【j】。
情况三:开始位置
开始位置有障碍,那么直接返回0
情况四:结束位置
结束位置如果有障碍,那么直接返回0
代码:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int i,j = 0,k=0;
for (i = 0 ; i < obstacleGrid.length;i++){
for (j = 0; j < obstacleGrid[i].length;j++){
if (i == 0 || j == 0){
if (obstacleGrid[i][j] == 1){
obstacleGrid[i][j] = -1;
}else {
if (j > 0){
if (obstacleGrid[i][j-1] == -1){
obstacleGrid[i][j] = -1;
}else {
obstacleGrid[i][j] = 1;
}
}
if (i > 0){
if (obstacleGrid[i - 1][j] == -1){
obstacleGrid[i][j] = -1;
} else {
obstacleGrid[i][j] = 1;
}
}
if (i == 0 && j == 0){
obstacleGrid[i][j] = 1;
}
}
}else {
if (obstacleGrid[i][j] == 1){
obstacleGrid[i][j] = -1;
}else {
if (obstacleGrid[i - 1][j] < 0 || obstacleGrid[i][j - 1] < 0) {
obstacleGrid[i][j] = obstacleGrid[i - 1][j] < 0 ? obstacleGrid[i][j - 1] : obstacleGrid[i - 1][j];
} else if (obstacleGrid[i - 1][j] > 0 && obstacleGrid[i][j - 1] > 0) {
obstacleGrid[i][j] = obstacleGrid[i - 1][j] + obstacleGrid[i][j - 1];
}
}
}
}
}
if (obstacleGrid[i-1][j-1] == -1){
return 0;
}
return obstacleGrid[i-1][j-1] ;
}
}