这里有个效率很低的算法。深度优先算法
public class Solution {
public static void main(String args[])
{
Solution sol=new Solution();
System.out.println(sol.uniquePathsWithObstacles(new int[][]{{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},{0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0},{1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1},{0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0},{0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0},{1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0},{0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1},{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0},{0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0},{0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1},{1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0},{0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1},{0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1},{1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1},{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0}}));
}
int count;
int [][] obstacleGrid;
int m;
int n;
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
this.obstacleGrid=obstacleGrid;
m=obstacleGrid.length;
n=obstacleGrid[0].length;
dfs(0,0);
return count;
}
public void dfs(int i,int j)
{
if(i>=m||j>=n) //超界
{
return ;
}
if(i==m-1&&j==n-1)//终点
{
count++;
return;
}
if(obstacleGrid[i][j]==1)//撞墙
{
return;
}
dfs(i+1,j);
dfs(i,j+1);
}
}
当然还有更好的基于dp的算法。
record[i][j]记录的是从起点到达ij的所有可能的步数。如果ij是不能到达的记为0.
int count;
int [][] obstacleGrid;
int [][] record;
int m;
int n;
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
this.obstacleGrid=obstacleGrid;
m=obstacleGrid.length;
n=obstacleGrid[0].length;
record=new int[m][n];
record[0][0]=1;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
dp(i,j);
}
}
return record[m-1][n-1];
}
public void dp(int i,int j)
{
if(obstacleGrid[i][j]!=1)
{
if(i-1>=0)
{
record[i][j]+=record[i-1][j];
}
if(j-1>=0)
{
record[i][j]+=record[i][j-1];
}
}
else
{
record[i][j]=0;
}
}