活动介绍

华为OD机试C卷- 迷宫问题(Java & JS & Python).md-私信看全套OD代码及解析

preview
需积分: 0 0 下载量 2 浏览量 更新于2024-06-09 收藏 5KB MD 举报
### 华为OD机试C卷 - 迷宫问题(Java & JS & Python) #### 题目背景 本题目是华为OD机试中的经典算法题之一,主要考察考生对于图遍历算法的理解与实现能力,特别是对于广度优先搜索(BFS)的应用。 #### 题目描述 给定一个二维数组`N * M`,数组中的值为0或1,0代表可以通过的路径,而1代表墙壁不可通过。任务是从左上角出发到达右下角,并且只能沿水平或垂直方向前进,最终找到一条从起点到终点的最短路径。 #### 数据范围 - 行数`N`和列数`M`的范围在2至10之间。 - 数组中的每个元素的取值范围在0至1之间。 #### 输入描述 - 第一行输入两个整数`N`和`M`,分别代表二维数组的行数和列数。 - 接下来的`N`行每行输入`M`个整数,构成二维数组`maze[N][M]`。 #### 输出描述 - 输出从左上角到右下角的最短路径,格式为一系列坐标对,用“->”分隔。 #### 解题思路 本题可以通过广度优先搜索(BFS)来求解。广度优先搜索是一种用于遍历或搜索树或图的算法。BFS特别适用于寻找两点之间的最短路径问题,因为它会按照路径长度逐渐增加的顺序来探索所有可能的路径。对于本题而言,我们从起点出发,逐步向四周扩散,直到到达终点为止。在这个过程中,我们需要记录已访问过的点,避免重复访问。 #### Java实现 下面给出Java语言实现的代码示例: ```java import java.util.*; public class MazePath { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 行数 int m = scanner.nextInt(); // 列数 int[][] maze = new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { maze[i][j] = scanner.nextInt(); } } findPath(maze, n, m); } private static void findPath(int[][] maze, int n, int m) { int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右、下、左、上 Queue<int[]> queue = new LinkedList<>(); boolean[][] visited = new boolean[n][m]; queue.offer(new int[]{0, 0}); visited[0][0] = true; StringBuilder path = new StringBuilder(); while (!queue.isEmpty()) { int[] current = queue.poll(); int x = current[0], y = current[1]; path.append("(").append(x).append(",").append(y).append(")->"); if (x == n - 1 && y == m - 1) { System.out.println(path.substring(0, path.length() - 4)); // 去掉最后一个"->" return; } for (int[] dir : directions) { int newX = x + dir[0], newY = y + dir[1]; if (newX >= 0 && newX < n && newY >= 0 && newY < m && maze[newX][newY] == 0 && !visited[newX][newY]) { queue.offer(new int[]{newX, newY}); visited[newX][newY] = true; } } } } } ``` #### Python实现 下面给出Python语言实现的代码示例: ```python from collections import deque def find_path(maze, n, m): directions = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 右、下、左、上 queue = deque([(0, 0)]) visited = [[False] * m for _ in range(n)] visited[0][0] = True path = [] while queue: x, y = queue.popleft() path.append(f"({x},{y})") if x == n - 1 and y == m - 1: print('->'.join(path[:-1])) # 去掉最后一个"->" return for dx, dy in directions: newX, newY = x + dx, y + dy if 0 <= newX < n and 0 <= newY < m and maze[newX][newY] == 0 and not visited[newX][newY]: queue.append((newX, newY)) visited[newX][newY] = True # 示例 maze = [ [0, 1, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], ] find_path(maze, 5, 5) ``` #### 总结 通过以上分析,我们可以看出,无论是Java还是Python,其实现的核心逻辑是一致的,都是基于广度优先搜索(BFS)的思想来实现的。这种类型的题目有助于深入理解图的遍历算法,并能够灵活应用于实际编程问题中。
身份认证 购VIP最低享 7 折!
30元优惠券