Java 在有障碍物的2D矩阵中找到到达给定目标单元的最短路径

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矩阵的值。第二 行包含机器人起始位置的单元格位置。第三 行包含目标的单元格位置。第四行和 下面的行将包含封锁的位置。 下面的示例仅

我正在处理下面的面试问题,我对如何使用BFS搜索感到困惑。我对如何处理这里的封锁感到困惑

给定MxN矩阵,找到到达给定目的地的最短路径 牢房。机器人可以上下左右移动。矩阵也 在机器人无法进入的几个细胞中设置了一系列封锁 通过。输出机器人所需的最小移动次数 设法到达目的地。如果目的地不在,则输出-1 可达成的。假设封锁从一开始就不会发生 牢房

输入格式:第一行包含M和N矩阵的值。第二 行包含机器人起始位置的单元格位置。第三 行包含目标的单元格位置。第四行和 下面的行将包含封锁的位置。 下面的示例仅包含机器人所在位置(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 • • •
我们有图形(使用(行、列)表示法):

(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)