java - 在有障碍物的二维矩阵中找到到达给定目标单元的最短路径
问题描述
我正在处理下面的面试问题,我对如何在这里使用 BFS 搜索感到困惑。我对如何处理这里的封锁感到困惑?
给定一个 MxN 矩阵,找到到达给定目标单元的最短路径。机器人可以上下左右移动。该矩阵还在机器人无法通过的少数几个单元中设置了一组封锁。输出机器人到达目的地所需的最小移动次数。如果目的地不可到达,则输出 -1。假设封锁永远不会在起始单元格。
输入格式:第一行包含 M 和 N 矩阵的值。第二行包含机器人起始位置的单元格位置。第三行包含目的地的单元格位置。第四行和随后的行将包含封锁的位置。下面的示例仅包含机器人无法通过的 (2,2) 处的一个封锁。下面是输入:
3 3
1 1
3 3
2 2
上述输入的输出应为 4。
以下是我开始的内容,但在进行 BFS 搜索时对如何处理此处的封锁感到困惑:
public static void main(String args[] ) throws Exception {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int N = sc.nextInt();
int startX = sc.nextInt();
int startY = sc.nextInt();
int destinationX = sc.nextInt();
int destinationY = sc.nextInt();
while (sc.hasNext()) {
int blockedX = sc.nextInt();
int blockedY = sc.nextInt();
}
}
解决方案
您可以简单地将网格视为图形:每个单元都连接到它的四个邻居(如果它在边缘上则更少),不包括任何封锁。使用您的示例:
1 2 3
1 • • •
2 • x •
3 • • •
我们有图表(使用 (row, col) 符号):
(1,1) <-> (1,2)
(2,1) <-> (3,1)
(3,1) <-> (2,3)
(2,3) <-> (3,3)
(3,3) <-> (3,2)
(3,2) <-> (3,1)
(3,1) <-> (2,1)
(2,1) <-> (1,1)
其中所有边长均为 1。现在您可以从起始节点应用标准BFS,直到到达目标节点,跟踪您访问的节点。在伪代码中:
- 将所有单元格距离标记为无限,除了距离为零的机器人起始单元格(您可以使用额外的 2D 数组来执行此操作,或者甚至可以就地执行此操作,具体取决于您存储网格的方式)。
- 初始化一个空的单元队列 Q
- 将机器人起始单元格添加到 Q
- 当 Q 不为空时:
- 从 Q 中取出下一个单元格 C
- 对于C的每个非封锁邻居N(容易从网格中确定):
- 如果 N 的距离为无穷大,则将 N 的距离标记为(C 的距离)+1,并将 N 添加到 Q。
- 如果 N 是目标单元格,则返回 N 的距离。
- 在这一点上,我们知道从起始单元格到目标单元格没有路径。
推荐阅读
- sed - sed 在 PATTERN1 和 PATTERN2 或 PATTERN3 之间打印文本
- javascript - 与 react 之外的功能组件通信
- django - 如何在 Django 或 DRF 中实现这样的自定义回滚?
- spring-boot - 如何在 Spring Boot 中配置 RabbitMQ 认证机制?
- c# - 在 Blazor 客户端中存储 JWT 令牌
- java - 用于将“X-Document-Type: Workbook”转换为 Excel 的 Java 库
- mysql - Mysql中两个日期列之间的较早日期
- r - R package check() 警告:完整的检查需要'checkbashisms'脚本
- c++ - 空格后的字符没有被打印出来
- android - Flutter ImagePicker 错误“找不到属性 android:requestLegacyExternalStorage”