1. 程式人生 > >LeetCode 63. Unique Paths II Java

LeetCode 63. Unique Paths II Java

false mos tac empty uniq pub ons str ide

題目:

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.

題意:給出一個二維格子,其中值為1的點表示障礙點,要求求出從最左上角的點到最右下角的點有多少種走法。使用動態規劃,對於其中一個點obstacleGrid[i][j](1<i<m,i<j<n),到該點的走法為d(obstacleGrid[i][j])=d(obstacleGrid[i-1][j])+d(obstacleGrid[i][j-1]),對於第一行和第一列,如果該點前面有障礙點,那麽到到此點有0中方法,反之為1。遍歷數組即可求解。

代碼:

public class Solution {

	public int uniquePathsWithObstacles(int[][] obstacleGrid) {
		
		int m=obstacleGrid.length;	//行
		int n=0;		//列
		if(m!=0)
			n=obstacleGrid[0].length;

		
		int[][] A=new int[m][n];		//用戶記錄起點到當前點走法
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				if(obstacleGrid[i][j]==1)		//如果一個點障礙點,則到該點的只有0中方法
					A[i][j]=0;
				else{
					if(i==0||j==0){		//如果是第一列或者第一行 ,若該點前面有障礙點,那麽改點也是不可以達到的
						boolean obstracle=false;
						if(i==0){
							for(int k=0;k<j;k++){
								if(obstacleGrid[i][k]==1)
									obstracle=true;
							}
						}
						else if(j==0){
							for(int k=0;k<i;k++){
								if(obstacleGrid[k][j]==1)
									obstracle=true;
							}
						}
						if(obstracle)
							A[i][j]=0;
						else A[i][j]=1;
						
					}else A[i][j]=A[i-1][j]+A[i][j-1];
				}
			}
		}
		return A[m-1][n-1];
	}
}

  

LeetCode 63. Unique Paths II Java