Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1
and 0
respectively in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is 2
.
Note: m and n will be at most 100.
解题思路:这题在上一题上多了一点限制,思路和上一题相似,主要是由正上方的路径和正左方的路径和来得到当前路径数量,由于多了障碍,所以要对障碍的位置进行判断。如果障碍是在第一行或者第一列,则障碍之前是可以走通的,障碍之后是没有路径可走的。而对于除去第一行和第一列的位置,先要对该处的障碍进行判断,如果当前位置有障碍,表示走不通,dp[i][j]=0; 否则,dp[i][j]仍然等于dp[i-1][j]+dp[i][j-1]。
public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
if(obstacleGrid.length >0 ){
if(obstacleGrid[0].length>0){
int row = obstacleGrid.length; //row 行长度
int col = obstacleGrid[0].length; //col 列长度
int [][] dp = new int [row][col];
if(obstacleGrid[0][0]==1 || obstacleGrid[row-1][col-1]==1){
return 0;
}else{
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
dp[i][j]=0;
}
}
for(int i=0;i<col;i++){ //对第一行进行计算
if(obstacleGrid[0][i]==0){
dp[0][i]=1;
}else{
break; //后面的保留dp初值0
}
}
for(int i=0;i<row;i++){ //对第一列进行计算
if(obstacleGrid[i][0]==0){
dp[i][0]=1;
}else{
break; //后面的保留dp初值0
}
}
for(int i=1;i<row;i++){
for(int j=1;j<col;j++){
if(obstacleGrid[i][j]==0){ //如果该处没有障碍
dp[i][j]=dp[i][j-1]+dp[i-1][j];
}else{
dp[i][j]=0; //如果该处有障碍
}
}
}
return dp[row-1][col-1];
}
}
}
return 0;
}
}