路徑總數

問題描述

一個機器人在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];
    }
};
發佈了239 篇原創文章 · 獲贊 31 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章