原题地址:不同路径 II - 力扣
题目描述
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:m 和 n 的值均不超过 100。
示例1
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: 2
解释:
3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
其实看到这道题我最开始感觉和走迷宫题差不多,于是想到的是用dfs来进行搜索,但是最后写出来的路径条数只有0条…不论怎么改都是0,苦于想不出问题出在哪里,于是放弃了这个方法(跪了)。
然后去优快云搜了一下这道题,看到他人写的题解博客 然后就有了个新方法。
我新建一个大小一样的二维数组,把起始位置设为1,其他地方设为0;
然后由于只能向下向右行走,于是一行行判断,他们的上边或左边的位置上的数字是否存在,存在就加到它身上。
这个数字代表的是到这个方格一共有多少走法,而一个方格的左边和上边的方格的走法和就是到本方格一共有多少走法。
最后返回最后一终点方格的数字就是一共有多少步走法。
于是乎得到AC代码 不断执行错误。。。。。
看了一下原因是因为数据溢出,然后我就全部改成long long int ,但改了之后它还是一直执行错误并说数据溢出。。。。然后我才发现,我设置记录走法的二维函数,我把它当成长宽相等的二维数组了。。。我真是个智障
在经过再一次修改后,终于AC啦 又开始报解答错误提示。。。。
看了一下错误的数据,发现它的二维数组是[ [1] ] 。。。。。这种时候记录走法的二维数组的起始位置不能为1…只能为0。
于是乎,加了个if 判断,这次终于AC啦!!!!!!!!!!!!!!
AC代码
long long int uniquePathsWithObstacles(int** a, int b, int* c){
long long int f[b][c[b - 1]];
if(a[0][0] == 0)
f[0][0] = 1;
else
f[0][0] = 0;
long long int i, j;
for(i = 0; i < b; i++){
for(j = 0; j < c[i]; j++){
if(i || j) f[i][j] = 0;
if(a[i][j] == 0){
if(i) f[i][j] += f[i - 1][j];
if(j) f[i][j] += f[i][j - 1];
}
}
}
return f[b - 1][c[b - 1] - 1];
}
晒一下我的提交记录。。。感觉真是辛酸。。。。。