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


### 题目描述补充 **题目:不同的路径** 给定一个 `m x n` 的网格,一个机器人从左上角开始移动。机器人每次只能向右或者向下移动一步。机器人试图达到网格的右下角。问有多少种不同的路径可以到达右下角? **注意**: - 网格中的障碍物和空位置分别用 `1` 和 `0` 来表示。 - 机器人不能通过障碍物(即值为 `1` 的格子)。 ### 示例 **输入**: ``` 障碍网格为: [ [0,0,0], [0,1,0], [0,0,0] ] ``` **输出**: ``` 2 ``` **解释**: 机器人可以从左上角到达右下角有两条路径:向右 -> 向下 -> 向下,或者向下 -> 向右 -> 向下。 ### PHP 示例代码 ```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 示例代码 ```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 示例代码 ```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 ``` **码小课**网站中有更多相关内容分享给大家学习,包括算法解析、面试技巧等,欢迎访问学习。
推荐面试题