遍历2D数组(网格)的最佳寻路算法(JavaScript/Java/ c#)
本文关键字:算法 JavaScript Java 寻路 2D 数组 网格 遍历 最佳 | 更新日期: 2023-09-27 18:10:51
我有一个2D数组,我想遍历它,从一个点开始到另一个点结束,条件如下:
- 只允许在水平和垂直方向移动
- 路径必须触及数组内的每个强制点
- 数组没有障碍物
图示:
+---+---+---+---+---+---+
| 0 | 0 | 1 | 0 | 0 | E |
+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 0 |
+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+
| S | 0 | 1 | 0 | 0 | 0 |
+---+---+---+---+---+---+
从S点开始,算法应该能够找到到达E的最短路径,触及所有以"1"表示的点,并且只能水平或垂直移动。
我必须在Javascript中实现它(但即使在c#或Java中也应该很好,我想我可以翻译它:))
哪种算法最适合我的需要?我已经谷歌了很多,但发现只有一些Dijkstra或a星实现是相似的,但不同(他们不必触及强制性点…)
有人遇到过这样的问题吗?
有人能帮忙吗?
提前感谢
好的,很抱歉回复晚了。我想你可能已经得到了一些实现。如果没有,想想这个。
让我先做一个简单的版本。假设S和E在各自的列中要么是最上面的,要么是最下面的。问题的图景与此相符。
算法应该:
- 向上(向下)移动列,直到达到最大值(当前列顶部,下一列顶部)。
- 切换到下一列。下一列成为当前列。
- 向下移动列,直到达到最大值(当前列底部,下一列底部)
注意事项
- 可以按行运行算法。
- 最后一行/列需要进行不同的处理。
- 最后一行/列和第一行/列可能需要遍历两次。
- 如果S和E位于行/列中间,需要修改。
注:我记得在什么地方做过这个算法问题。如果我找到来源,我会把它贴出来。