当前位置: 面试刷题>> 迷宫 (经典算法题500道)


**题目描述补充**: 给定一个二维数组(迷宫),其中`0`表示可走的路径,`1`表示障碍物(墙壁)。迷宫中只有一个入口(左上角)和一个出口(右下角)。要求编写一个算法,判断从入口到出口是否存在一条路径,如果存在则返回`true`,否则返回`false`。 **示例输入**: ``` [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 0] ] ``` **示例输出**: ``` true ``` **算法思路**: 可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决这个问题。这里,我们将使用深度优先搜索作为示例来解答。 **PHP 示例代码**: ```php function hasPath($maze) { if (empty($maze) || empty($maze[0])) { return false; } $rows = count($maze); $cols = count($maze[0]); // 深度优先搜索函数 function dfs($maze, $i, $j, &$visited) { $rows = count($maze); $cols = count($maze[0]); // 边界条件:到达右下角出口 if ($i == $rows - 1 && $j == $cols - 1) { return true; } // 标记当前位置已访问 $visited[$i][$j] = true; // 四个方向的偏移量 $directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; foreach ($directions as $dir) { $newX = $i + $dir[0]; $newY = $j + $dir[1]; // 检查新位置是否合法且可走且未访问过 if ($newX >= 0 && $newX < $rows && $newY >= 0 && $newY < $cols && !$visited[$newX][$newY] && $maze[$newX][$newY] == 0) { if (dfs($maze, $newX, $newY, $visited)) { return true; } } } // 回溯,标记当前位置为未访问(可选,因为最终会遍历完所有路径) $visited[$i][$j] = false; return false; } $visited = array_fill(0, $rows, array_fill(0, $cols, false)); return dfs($maze, 0, 0, $visited); } // 示例用法 $maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 0] ]; echo hasPath($maze) ? "true" : "false"; ``` **Python 示例代码**: ```python def hasPath(maze): if not maze or not maze[0]: return False rows, cols = len(maze), len(maze[0]) def dfs(i, j, visited): if i == rows - 1 and j == cols - 1: return True visited[i][j] = True directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] for dx, dy in directions: newX, newY = i + dx, j + dy if 0 <= newX < rows and 0 <= newY < cols and not visited[newX][newY] and maze[newX][newY] == 0: if dfs(newX, newY, visited): return True return False visited = [[False] * cols for _ in range(rows)] return dfs(0, 0, visited) # 示例用法 maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 0] ] print(hasPath(maze)) # 输出: True ``` **JavaScript 示例代码**: ```javascript function hasPath(maze) { if (!maze.length || !maze[0].length) { return false; } const rows = maze.length; const cols = maze[0].length; function dfs(i, j, visited) { if (i === rows - 1 && j === cols - 1) { return true; } visited[i][j] = true; const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; for (const [dx, dy] of directions) { const newX = i + dx; const newY = j + dy; if ( newX >= 0 && newX < rows && newY >= 0 && newY < cols && !visited[newX][newY] && maze[newX][newY] === 0 ) { if (dfs(newX, newY, visited)) { return true; } } } return false; } const visited = Array.from({ length: rows }, () => Array(cols).fill(false)); return dfs(0, 0, visited); } // 示例用法 const maze = [ [0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 0] ]; console.log(hasPath(maze)); // 输出: true ``` **码小课**网站中有更多相关内容分享给大家学习,包括但不限于算法题解、编程技巧、数据结构等,欢迎大家访问学习。
推荐面试题