繁体   English   中英

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

[英]Shortest Path(s) in unweighted 2D array. How to show steps/directions taken during BFS

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

示例输入二维数组

示例输出二维数组

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

从您的示例中,S 将是零(从 S 到 S 的零步)而 D 是 16(从 S 到 D 的 16 步)。 现在您拥有所需的一切。

您现在可以:

1:选择结束节点(d=16)

2: 搜索它的紧邻 (n,e,s,w)

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

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

5:foreach选取的节点,执行步骤2-3

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

这就是算法的粗略形状。 它适用于任何位置的 D。 但是,如果您移动 S,则需要重新标记每个节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM