LeetCode63-不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
一、思路
(一)数学方法
和LeetCode62类似的,也可以用组合数学的知识来解决
首先计算出无障碍时,可能的路径,然后,考虑在这些可能路径中,经过障碍物的可能路径有多少种
这种方案在之前讲过了
(二)回溯算法
回溯算法怎么回溯呢?
回溯算法只有一个变量用于回溯,这里有两个,那么就采用打包的办法将两个一起回溯了
然而,发现了一个很严重的问题,举例来说明一下:
[0,0,0]
[0,1,0]
[0,0,0]
在这张地图中,当你移动到(1,2)时:
此时下一步你就到了终点,然后你进行回溯,看看能否有另外一条路,此时已经没有别的路,于是你再一次回退,如果你是从(0,2)中移动到(1,2)的,你会发现,你还是没得选,只能往下走
没错,其实你在某次进行选择的时候,其实是和你之前所做的操作有关,这种约束十分强烈
在这种情况下,回溯算法要写出来,需要很多附加条件
(三)动态规划
之前的回溯算法,我尝试着写了,但是总有问题,而且正如之前举的例子,在很多情况下的回溯真的很蠢,完全没有必要
现在举个例子,来探究一下这道题目蕴含的规律
[0,0,0]
[0,1,0]
[0,0,0]
来看看抵达终点的情况:
- 从(1,2)向下走一步
- 从(2,1)向右走一步
假设 f ( i , j ) f(i,j) f(i,j)表示到达 ( i , j )