Java 在有障碍物的2D矩阵中找到到达给定目标单元的最短路径
我正在处理下面的面试问题,我对如何使用BFS搜索感到困惑。我对如何处理这里的封锁感到困惑 给定MxN矩阵,找到到达给定目的地的最短路径 牢房。机器人可以上下左右移动。矩阵也 在机器人无法进入的几个细胞中设置了一系列封锁 通过。输出机器人所需的最小移动次数 设法到达目的地。如果目的地不在,则输出-1 可达成的。假设封锁从一开始就不会发生 牢房 输入格式:第一行包含M和N矩阵的值。第二 行包含机器人起始位置的单元格位置。第三 行包含目标的单元格位置。第四行和 下面的行将包含封锁的位置。 下面的示例仅包含机器人所在位置(2,2)处的一个封锁 不能通过。以下是输入: 上述输入的输出应为4 以下是我开始的内容,但在进行BFS搜索时,我对如何处理封锁感到困惑:Java 在有障碍物的2D矩阵中找到到达给定目标单元的最短路径,java,algorithm,data-structures,breadth-first-search,microsoft-distributed-file-system,Java,Algorithm,Data Structures,Breadth First Search,Microsoft Distributed File System,我正在处理下面的面试问题,我对如何使用BFS搜索感到困惑。我对如何处理这里的封锁感到困惑 给定MxN矩阵,找到到达给定目的地的最短路径 牢房。机器人可以上下左右移动。矩阵也 在机器人无法进入的几个细胞中设置了一系列封锁 通过。输出机器人所需的最小移动次数 设法到达目的地。如果目的地不在,则输出-1 可达成的。假设封锁从一开始就不会发生 牢房 输入格式:第一行包含M和N矩阵的值。第二 行包含机器人起始位置的单元格位置。第三 行包含目标的单元格位置。第四行和 下面的行将包含封锁的位置。 下面的示例仅
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 • • •
我们有图形(使用(行、列)表示法):
(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。现在,您可以从开始节点应用标准,直到到达目标节点,并跟踪您访问的节点。在伪代码中:
- 将所有单元距离标记为无限,但机器人起始单元的距离为零(您可以使用额外的2D阵列来完成此操作,或者甚至可以根据网格的存储方式将其放置到位)
- 初始化单元格Q的空队列
- 将机器人启动单元添加到Q
- Q不是空的:
- 从Q中退出下一个单元格C
- 对于C的每个非阻塞邻居N(易于从网格中确定):
- 如果N的距离为无穷大,则将N的距离标记为(C的距离)+1,并将N与Q相加
- 如果N是目标单元格,则返回N的距离
- 此时,我们知道从起始单元格到目标单元格没有路径
1 2 3
1 • • •
2 • x •
3 • • •
(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)