Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未加权二维阵列中的最短路径。如何显示BFS期间采取的步骤/方向_Java_Multidimensional Array_Breadth First Search_Shortest Path - Fatal编程技术网

Java 未加权二维阵列中的最短路径。如何显示BFS期间采取的步骤/方向

Java 未加权二维阵列中的最短路径。如何显示BFS期间采取的步骤/方向,java,multidimensional-array,breadth-first-search,shortest-path,Java,Multidimensional Array,Breadth First Search,Shortest Path,在这个算法中,我试图做的是,给定一个2D数组,从给定的起点(S)和给定的终点(D)找到最短路径——记住数组(*)中的一些元素被认为是障碍物。通常情况下,我会执行典型的BFS并返回最短路径的距离,但有一点额外的褶皱。我需要通过用路径到目的地的基本方向(北、南、东或西,分别缩写为n、s、e、w)替换遍历的元素来显示所采用的最短路径。在多条最短路径的情况下,您可以向南或向东到达目标,元素将填充基本方向的组合,即“se”,如第二张图所示请注意,这并不意味着东南方向,因为不允许对角遍历。我熟悉在算法中使用

在这个算法中,我试图做的是,给定一个2D数组,从给定的起点(S)和给定的终点(D)找到最短路径——记住数组(*)中的一些元素被认为是障碍物。通常情况下,我会执行典型的BFS并返回最短路径的距离,但有一点额外的褶皱。我需要通过用路径到目的地的基本方向(北、南、东或西,分别缩写为n、s、e、w)替换遍历的元素来显示所采用的最短路径。在多条最短路径的情况下,您可以向南或向东到达目标,元素将填充基本方向的组合,即“se”,如第二张图所示请注意,这并不意味着东南方向,因为不允许对角遍历。我熟悉在算法中使用BFS,但对于如何标记包含方向的路径,我有点困惑。我不一定要寻找一个完整的算法来回答这个问题,但更多的是一个伪代码的答案,让我在正确的轨道上。第一张图片是样本输入阵列,第二张图片是所述输入阵列的“解决方案”TL:DR我正在征求有关如何在执行BFS时跟踪网格方向的建议非常感谢所有帮助/反馈,并提前向您表示感谢

您可以用一段元数据标记每个节点(数组条目):最短路径长度。这可以用BFS来完成,但BFS基本上能让你达到目的。每个可访问的节点都应该有一个编号

从您的示例中,S是零(从S到S的步骤为零),D是16(从S到D的步骤为16)。现在你需要的东西都有了

您现在可以:

1:拾取结束节点(d=16)

2:搜索其附近(北、东、南、西)

3:如果节点有d-1,根据您所看到的四个方向中的哪个方向,写(附加)一个字母。忽略其他节点

4:选择具有d-1和至少1个字母的所有节点

5:对于每个拾取的节点,执行步骤2-3

6:如果(d-1>0)d=d-1并执行步骤4-5

这是一个能做到这一点的算法的大致形状。它在任何地方都适用于D。但是,如果移动S,则需要重新标记每个节点。

可以使用一段元数据标记每个节点(数组项):最短路径长度。这可以用BFS来完成,但BFS基本上能让你达到目的。每个可访问的节点都应该有一个编号

从您的示例中,S是零(从S到S的步骤为零),D是16(从S到D的步骤为16)。现在你需要的东西都有了

您现在可以:

1:拾取结束节点(d=16)

2:搜索其附近(北、东、南、西)

3:如果节点有d-1,根据您所看到的四个方向中的哪个方向,写(附加)一个字母。忽略其他节点

4:选择具有d-1和至少1个字母的所有节点

5:对于每个拾取的节点,执行步骤2-3

6:如果(d-1>0)d=d-1并执行步骤4-5

这是一个能做到这一点的算法的大致形状。它在任何地方都适用于D。但是,如果移动了,则需要重新标记每个节点