当前位置: 面试刷题>> 不同的路径 (经典算法题500道)


题目描述补充

题目:不同的路径

给定一个 m x n 的网格,一个机器人从左上角开始移动。机器人每次只能向右或者向下移动一步。机器人试图达到网格的右下角。问有多少种不同的路径可以到达右下角?

注意

  • 网格中的障碍物和空位置分别用 10 来表示。
  • 机器人不能通过障碍物(即值为 1 的格子)。

示例

输入

障碍网格为:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]

输出

2

解释: 机器人可以从左上角到达右下角有两条路径:向右 -> 向下 -> 向下,或者向下 -> 向右 -> 向下。

PHP 示例代码

function uniquePathsWithObstacles($obstacleGrid) {
    $m = count($obstacleGrid);
    $n = count($obstacleGrid[0]);
    
    // 创建一个二维数组来保存到达每个格子的路径数
    $dp = array_fill(0, $m, array_fill(0, $n, 0));
    
    // 初始化左上角为1,如果左上角是障碍物则无法到达,返回0
    if ($obstacleGrid[0][0] == 1) {
        return 0;
    }
    $dp[0][0] = 1;
    
    // 初始化第一列
    for ($i = 1; $i < $m; $i++) {
        if ($obstacleGrid[$i][0] == 0) {
            $dp[$i][0] = $dp[$i-1][0];
        }
    }
    
    // 初始化第一行
    for ($j = 1; $j < $n; $j++) {
        if ($obstacleGrid[0][$j] == 0) {
            $dp[0][$j] = $dp[0][$j-1];
        }
    }
    
    // 填充剩余的格子
    for ($i = 1; $i < $m; $i++) {
        for ($j = 1; $j < $n; $j++) {
            if ($obstacleGrid[$i][$j] == 0) {
                $dp[$i][$j] = $dp[$i-1][$j] + $dp[$i][$j-1];
            }
        }
    }
    
    return $dp[$m-1][$n-1];
}

// 示例用法
$obstacleGrid = [
    [0,0,0],
    [0,1,0],
    [0,0,0]
];
echo uniquePathsWithObstacles($obstacleGrid); // 输出 2

Python 示例代码

def uniquePathsWithObstacles(obstacleGrid):
    m, n = len(obstacleGrid), len(obstacleGrid[0])
    dp = [[0] * n for _ in range(m)]
    
    if obstacleGrid[0][0] == 1:
        return 0
    dp[0][0] = 1
    
    # 初始化第一列
    for i in range(1, m):
        if obstacleGrid[i][0] == 0:
            dp[i][0] = dp[i-1][0]
    
    # 初始化第一行
    for j in range(1, n):
        if obstacleGrid[0][j] == 0:
            dp[0][j] = dp[0][j-1]
    
    # 填充剩余的格子
    for i in range(1, m):
        for j in range(1, n):
            if obstacleGrid[i][j] == 0:
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
    
    return dp[m-1][n-1]

# 示例用法
obstacleGrid = [
    [0,0,0],
    [0,1,0],
    [0,0,0]
]
print(uniquePathsWithObstacles(obstacleGrid)) # 输出 2

JavaScript 示例代码

function uniquePathsWithObstacles(obstacleGrid) {
    const m = obstacleGrid.length;
    const n = obstacleGrid[0].length;
    const dp = new Array(m).fill(0).map(() => new Array(n).fill(0));
    
    if (obstacleGrid[0][0] === 1) {
        return 0;
    }
    dp[0][0] = 1;
    
    // 初始化第一列
    for (let i = 1; i < m; i++) {
        if (obstacleGrid[i][0] === 0) {
            dp[i][0] = dp[i-1][0];
        }
    }
    
    // 初始化第一行
    for (let j = 1; j < n; j++) {
        if (obstacleGrid[0][j] === 0) {
            dp[0][j] = dp[0][j-1];
        }
    }
    
    // 填充剩余的格子
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            if (obstacleGrid[i][j] === 0) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
    }
    
    return dp[m-1][n-1];
}

// 示例用法
const obstacleGrid = [
    [0,0,0],
    [0,1,0],
    [0,0,0]
];
console.log(uniquePathsWithObstacles(obstacleGrid)); // 输出 2

码小课网站中有更多相关内容分享给大家学习,包括算法解析、面试技巧等,欢迎访问学习。