题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1
和 0
来表示。
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
为0
或1
解题思路
定义了一个二维数组way,其中的元素代表从起点到对应位置的路径数。一开始给数组way遍历为每个元素赋初值为0。因为从起点到起点的路径数必定是1,所以给起点元素即way[0][0]赋值为1。
接下来重点讲一下算法,因为机器人只能向下或向右移动,所以机器人要从起点到达某个格子必须经过该格子的上面或左侧的格子,所以机器人要从起点到该格子的路径数为从起点到对应格子上面的格子的路径数加上从起点到对应格子左侧的格子的路径数,如图所示,机器人要从起点到A格子的路径数为从起点到B格子的路径数加上从起点到C格子的路径数。
除此之外,我们还要考虑到起点可能会放置障碍物,则路径数为0,所以有如下代码直接返回路径数为0。
if(obstacleGrid[0][0])
return 0;
还要考虑到格子本身是障碍物的情况,则对应路径数必为0,与其初始值一致,故直接continue即可。
if(obstacleGrid[bl][bll])
continue;
还要考虑到计算到格子路径数时格子位于首行或首列,则对应路径数只能为左侧路径数或上面的路径数。
if(bl)
way[bl][bll]+=way[bl-1][bll];
if(bll)
way[bl][bll]+=way[bl][bll-1];
最后计算完数组way的每一个元素后,函数返回way[n-1][m-1]即可。
代码
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
int n=obstacleGridSize,m=obstacleGridColSize[0],bl,bll;
int way[n][m];
for(bl=0;bl<n;bl++)
for(bll=0;bll<m;bll++)
way[bl][bll]=0;
way[0][0]=1;
if(obstacleGrid[0][0])
return 0;
for(bl=0;bl<n;bl++)
for(bll=0;bll<m;bll++)
{
if(obstacleGrid[bl][bll])
continue;
if(bl)
way[bl][bll]+=way[bl-1][bll];
if(bll)
way[bl][bll]+=way[bl][bll-1];
}
return way[n-1][m-1];
}
链接:https://leetcode-cn.com/problems/unique-paths-ii/solution/63bu-tong-lu-jing-ii-zai-li-kou-wan-chen-whvl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。