问题描述
我正在寻找一种算法,该算法告诉我A点和B点之间是否存在路径。 我不需要知道路径的实际位置,只需要知道路径是否存在,执行时间就很关键。基本网格具有空字段或墙壁,仅这两个字段。 你们能建议点什么吗?
编辑:我想我要澄清一下。我拥有的是这样的基本网格:
O O O X O
O O O X X
O O O X O
O O X X O
O O O X O
其中O-空空间,X-墙,起点A(0,0)和终点B(4,4)。我想做的是检查我可以移除一条墙多少次才能使路径存在,并且端点可以到达。
解决方法
A*及其变体通常用于此类问题。
在搜索之前,A *搜索算法做出了明智的决定,即下一步应该探索哪些细胞,并且这样做可以通过不探究“不感兴趣的”节点(细胞)来更快地进行搜索。
由于您不太关心最优性,因此还可以利用bounded relaxation,它通常会加快搜索速度(以最优性为代价)。
一个很好的网格启发式方法是manhattan distances。
,如果只有2个点A
和B
可以在2D网格中进行检查,则可以采用depth first search
或breadth first search
来检查路径是否存在。 / p>
如果以查询的形式为您提供网格和几对要检查的点,则可以采用以下方法:
-
我们仅在未访问的空单元格上逐个单元地迭代2D网格单元格。
-
我们将使用深度优先搜索(或广度优先搜索),无论您希望标记这些单元格是什么。
-
标记过程包括移至空单元格并用值(例如数字)标记它们。所有连接的空单元格形成一个岛。
-
这样,如果任意两对点属于同一岛,则它们之间存在一条路径;如果它们不属于同一岛,则不存在路线。
您可以参考下面的图片以获得更好的可视化效果。在这里,黑色单元格是墙壁,彩色单元格是岛,这意味着带有某些值的单元格属于同一连接的组件。
-
在上述算法中,用颜色或数字标记每个单元的时间复杂度为
O(m * n)
,其中m
和n
为否。行和列,因为我们在DFS或BFS期间仅访问每个单元一次。 -
回答每2对点的每个查询的时间复杂度为
O(1)
。