题目:
一个机器人位于一个 m x n 网格的左上角,机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,现在考虑网格中有障碍物(1)。那么从左上角到右下角将会有多少条不同的路径?
示例:
输入:[[0,0,0],[0,1,0],[0,0,0]]
输出: 2
代码:
public class Test21 {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if (obstacleGrid[0][0]==1) {
return 0;
}
for (int i = 0; i < obstacleGrid.length; i++) {
for (int j = 0; j < obstacleGrid[i].length; j++) {
if (obstacleGrid[i][j]==1) {
obstacleGrid[i][j]=-1;
}
}
}
obstacleGrid[0][0]=1;
for (int i = 1; i <obstacleGrid[0].length ; i++) {
if (obstacleGrid[0][i]==0) {
obstacleGrid[0][i]=1;
}else{
for (int j = i+1; j <obstacleGrid[0].length ; j++) {
obstacleGrid[0][i]=-1;
}
break;
}
}
for (int i = 1; i < obstacleGrid.length; i++) {
if (obstacleGrid[i][0]==0) {
obstacleGrid[i][0]=1;
}else{
for (int j = i+1; j <obstacleGrid.length ; j++) {
obstacleGrid[i][0]=-1;
}
break;
}
}
for (int i = 1; i < obstacleGrid.length; i++) {
for (int j=1; j < obstacleGrid[i].length; j++) {
if (obstacleGrid[i][j]!=-1) {
obstacleGrid[i][j]=(obstacleGrid[i][j-1]==-1?0:obstacleGrid[i][j-1])+(obstacleGrid[i-1][j]==-1?0:obstacleGrid[i-1][j]);
}
}
}
return obstacleGrid[obstacleGrid.length-1][obstacleGrid[0].length-1]==-1?0:obstacleGrid[obstacleGrid.length-1][obstacleGrid[0].length-1];
}
}