路径总数

问题描述

一个机器人在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];
    }
};
发布了235 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44781107/article/details/103562161