华为OD机试C卷- 迷宫问题(Java & JS & Python).md-私信看全套OD代码及解析
需积分: 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)的思想来实现的。这种类型的题目有助于深入理解图的遍历算法,并能够灵活应用于实际编程问题中。

飞码创造者
- 粉丝: 2w+
最新资源
- 综合布线教程第4章.pptx
- 国家开放大学电大本科《儿童发展问题的咨询与辅导》网络课形考作业题库及答案.docx
- 聚焦核心素养--协助深度学习2022.5.13公开课.pptx
- 综合项目管理人员安全关键技术交底.doc
- 网络逻辑结构物理拓扑图例公开课一等奖优质课大赛微课获奖课件.pptx
- 在全市文化和旅游系统安全生产培训会议上的讲话.doc
- 微信小程序示例教程完整版详解
- 项目管理月报.docx
- 江苏科技大学操作系统实验.pdf
- 小学语文网络课程资源开发方案.doc
- 猫扑:树立网络营销新维度.pptx
- 数据库技术及应用实验指导书.doc
- 双电伺服数控转塔冲床控制系统软件.doc
- 音视频智能系统集成工程资质管理规定.doc
- 自动化仪表施工组织设计.pdf
- 投资估算法可行性研究报告.pptx