1. 程式人生 > >[LeetCode]_63 Unique Paths II

[LeetCode]_63 Unique Paths II

一、題目描述

A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

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.

大體意思:

機器人從star 到黃色星星標註的點,一共找到多少種路徑。

rule:

機器人只能往下面或者往後面走。

每個方格記憶體放一個數字,如果是0則表示方格可以通過如果為1表示方格上面有障礙物不能通過。

二解題思路及程式碼

首先確定問題的性質,到達黃色星星的路徑個數,僅與到達黃色星星上面的路徑數目與到達黃色星星左邊路徑數目有關。

當前狀態僅與前面的有限個狀態有關。

決定用動態規劃的思想。

定義狀態:store[i][j]//表示到達i行j 列的路徑

狀態轉移方程:store[i][j]=store[i-1][j]+store[i][j-1]//當前路徑數等於到達左邊路徑數目加上到達後面路徑數目

對特殊情況考慮:

當前方格取值為1:

則當前到達當前方格沒有路徑,用sotre[i][j]=-5表示沒有路徑

當前方格取值為0:

檢視store[i-1][j]與sotre[i][j-1]狀態

只有當sotre[i-1][j]方格為0並且sotre[i-1][j]有路徑的時候才可以取出當前值

如果不滿足條件則代表到達i-1,j的路徑數為0

有如下表達式:

int a =(obstacleGrid[i-1][j]==0&&store[i-1][j]!=-5)?store[i-1][j]:0;
int b=(obstacleGrid[i][j-1]==0&&store[i][j-1]!=-5)?store[i][j-1]:0;
store[i][j]=a+b;
if(store[i][j]==0)
{
store[i][j]=-5;
}

完整程式程式碼:

class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {

int row=obstacleGrid.size();
int colu=obstacleGrid[0].size();
vector<vector<int>> store(row,vector<int>(colu,0));
int i,j;//用於進行迴圈遍歷
for(i=0;i<colu;i++)
{
if(obstacleGrid[0][i]==0)

{
store[0][i]=1;
}
else{break;}

}
for(;i<colu;i++)
{
store[0][i]==-5;
}

for(j=0;j<row;j++)
{
if(obstacleGrid[j][0]==0)

{
store[j][0]=1;
}
else{
break;}
}
for(;j<row;j++)
{
store[j][0]=-5;
}
for(i=1;i<row;i++)
{
for(j=1;j<colu;j++)
{

if(obstacleGrid[i][j]==1)
{
store[i][j]=-5;
continue;
}
int a =(obstacleGrid[i-1][j]==0&&store[i-1][j]!=-5)?store[i-1][j]:0;
int b=(obstacleGrid[i][j-1]==0&&store[i][j-1]!=-5)?store[i][j-1]:0;
store[i][j]=a+b;
if(store[i][j]==0)
{
store[i][j]=-5;
}
}

}
if(store[row-1][colu-1]==-5)
{
return 0;
}
return store[row-1][colu-1];



}
};

三、題目總結

在初始化的時候忽略了一種情況,當第一行或第一列某個位置出現1以後,後面所有的方格都將沒有路徑。