LeetCode[63] 不同路径 II(DP)
本题目为 不同路径 扩展题,区别在于增添有障碍物的情况。
题目描述
一个机器人位于一个 m x n 网格的左上角(起始点为图中的 “Start”),机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: [ [0,0,0], [0,1,0], [0,0,0] ]
输出: 2
解释: 3x3 网格的正中间有一个障碍物,从左上角到右下角一共有 2 条不同的路径:
- 向右 -> 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右 -> 向右
题解思路
实现思路与 不同路径 一样,使用动态规划求解。区别在于求状态值时需要判断当前坐标是否有障碍物,如果有障碍物,当前状态值为 0。其状态转移方程如下:
- (0, 0) 处有障碍物,return 0,无法到达
- i == 0 && j == 0,status[i][j] = 1
- i == 0 && j != 0,status[i][j] = 判断有障碍物 ? 0 : status[i][j - 1]
- i != 0 && j == 0,status[i][j] = 判断有障碍物 ? 0 : status[i - 1][j]
- i != 0 && j != 0,status[i][j] = 判断有障碍物 ? 0 : status[i - 1][j] + status[i][j - 1]
代码实现
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
if(obstacleGrid[0][0] == 1) {
return 0;
}
long **status = (long **)malloc(sizeof(long *) * obstacleGridSize);
int i, j;
for(i = 0; i < obstacleGridSize; i++) {
status[i] = (long *)malloc(sizeof(long) * (*obstacleGridColSize));
memset(status[i], 0, *obstacleGridColSize);
}
for(i = 0; i < obstacleGridSize; i++) {
for(j = 0; j < *obstacleGridColSize; j++) {
if(i == 0 && j == 0) {
status[i][j] = 1;
}
else if(i == 0 && j != 0) {
status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i][j - 1];
}
else if(i != 0 && j == 0) {
status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i - 1][j];
}
else {
status[i][j] = (obstacleGrid[i][j] == 1) ? 0 : status[i - 1][j] + status[i][j - 1];
}
}
}
return status[obstacleGridSize - 1][*obstacleGridColSize - 1];
}
所有博客均在CSDN首发 Caso_卡索 https://blog.csdn.net/xiaoma_2018