"不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
注意事项
m 和 n 均不超过100
样例
如下所示在3x3的网格中有一个障碍物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
注意事项
m 和 n 均不超过100
样例
如下所示在3x3的网格中有一个障碍物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有2条不同的路径从左上角到右下角。
import java.util.Scanner;
/**
* "不同的路径" 的跟进问题:
现在考虑网格中有障碍物,那样将会有多少条不同的路径?
网格中的障碍和空位置分别用 1 和 0 来表示。
注意事项
m 和 n 均不超过100
样例
如下所示在3x3的网格中有一个障碍物:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
一共有2条不同的路径从左上角到右下角。
* @author Dell
*
*/
public class Test115 {
public static int uniquePathsWithObstacles(int[][] obstacleGrid)
{
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int[][] dp=new int[m][n];
if(obstacleGrid[0][0]==0)
dp[0][0]=1;
else
dp[0][0]=0;
for(int j=1;j<n;j++)
{
if(dp[0][j-1]==1&&obstacleGrid[0][j]==0)
dp[0][j]=1;
else
dp[0][j]=0;
}
for(int i=1;i<m;i++)
{
if(dp[i-1][0]==1&&obstacleGrid[i][0]==0)
dp[i][0]=1;
else
dp[i][0]=0;
}
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(obstacleGrid[i][j]==1)
dp[i][j]=0;
else
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int[][] a=new int[m][n];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=sc.nextInt();
}
}
System.out.println(uniquePathsWithObstacles(a));
}
}