問題描述
一個機器人在m*n大小的地圖的左上角, 機器人每次向下或向右移動, 機器人要到達地圖的右下角,可以有多少種不同的路徑從起點走向終點.
用(0, 0)表示起始點
(i, j)表示終點
也就是說,問題可以分解爲下面的子問題:
從(0, 0)到(1, 0), (2, 0), (3, 0)…(m - 1, n - 1)的路徑數
用F(i, j)表示從(0, 0)到(i, j)的路徑數, 狀態遞推就可以找到:
F(i, j) = F(i - 1, j) + F(i, j - 1);
這裏我們需要注意的一點是特殊情況第0行和第0列, 到達第0行每一點的路勁都只能來自它左邊的點, 即全爲1( F(0, j) == 1)
同理 F(i, 0) == 1
代碼如下:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> v(m, vector<int>(n, 1));
for (int i = 1; i < m; ++i)
{
for (int j = 1; j < n; ++j)
{
v[i][j] = v[i - 1][j] + v[i][j - 1];
}
}
return v[m - 1][n - 1];
}
};
在該題目的基礎上繼續思考, 如果在地圖的某些地方加入了一些障礙, 那麼最終會產生多少條路徑呢
分別用0, 1表示空白域和障礙
比如下面這樣, 在一個3*3的地圖中央有一個障礙
[0, 0, 0]
[0, 1, 0]
[0, 0, 0]
跟上面題目最大的不同點就是, 我們需要給有障礙的地方強制歸0, 也就是有障礙的地方無論如何都到達不了, 即路徑爲0條.
這樣我們在初始化的時候就要注意第0行和第0列, 如果出現了1(也就是有障礙的情況), 不僅要將該點處歸爲0, 從該點處往後或者往下也全爲0
代碼如下:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int row = obstacleGrid.size();
int col = obstacleGrid[0].size();
vector<vector<int>> v(row, vector<int>(col, 0));
for (int i = 0; i < col; ++i)
{
if (obstacleGrid[0][i] == 1)
{
break;
}
else
{
v[0][i] = 1;
}
}
for (int j = 0; j < row; ++j)
{
if (obstacleGrid[j][0] == 1)
{
break;
}
else
{
v[j][0] = 1;
}
}
for (int i = 1; i < row; ++i)
{
for (int j = 1; j < col; ++j)
{
if (obstacleGrid[i][j] == 1)
{
v[i][j] = 0;
}
else
{
v[i][j] = v[i - 1][j] + v[i][j - 1];
}
}
}
return v[row - 1][col - 1];
}
};