连接2D阵列中的不相交集

时间:2015-04-10 04:41:05

标签: algorithm grid path-finding disjoint-sets disjoint-union

我正在尝试生成一个具有可遍历和不可遍历位置的随机网格,并确保从一个可遍历位置到4个方向之一中的任何其他可遍历位置{Right,Up,Left,Down }。可交叉头寸表示为" []"和不可交叉的头寸表示为" [X]"

Here is a grid I have generated: 
[ ][ ][ ][ ][ ][ ][ ][ ][X][ ][ ][X][ ][X]
[ ][ ][X][ ][ ][ ][X][ ][ ][X][X][ ][ ][ ]
[X][ ][ ][ ][ ][X][X][X][ ][ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ][X][ ][ ][ ][X][ ][ ][X][ ]
[ ][X][ ][ ][ ][X][ ][ ][ ][ ][X][X][X][X]
[ ][ ][X][X][X][ ][ ][ ][X][X][X][X][X][X]
[ ][X][ ][ ][ ][X][ ][ ][ ][X][X][ ][ ][X]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][X][ ][ ][ ]
[ ][ ][X][ ][ ][ ][X][ ][X][X][ ][ ][ ][ ]
[ ][X][ ][X][ ][ ][ ][ ][ ][ ][X][X][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][X][ ][ ][X][X][ ]

我可以使用什么算法在网格中找到不相交集并在不相交集之间创建路径?谢谢!

1 个答案:

答案 0 :(得分:2)

要查找不相交的组件,您可以使用从任何可遍历位置开始的广度优先搜索(带队列)或深度优先搜索(带有堆栈)。当搜索终止时,它将标记整个组件。然后,如果有未标记的位置,请将这些作为另一个搜索的起点等,直到您标记了所有可遍历的位置。

要弄清楚哪些不可移动的位置必须被删除,如果你希望尽可能少地移除(几乎),可以将每个“不相交的集合”(最好称之为“连通组件”)视为单个图中的节点,并查看连接它们的各种路径。计算将节点连接到另一个节点的每条路径必须删除的X的数量,并将其用作图形中边的权重。然后,您希望使用例如Kruskal算法找到该图的最小生成树。

该方法无法保证找到要移除的最小X数以连接可遍历的位置;例如,在你给出的图表中,删除右上角附近的单个X连接三个组件,而我的建议可能会导致删除两个X.但是,你的问题含糊不清,所以我认为差异并不重要。

为了找到要删除的X的确切最小数量,你必须解决“节点加权的Steiner树问题”,我认为这通常是NP难的。鉴于您的图形是平面的,您可能会得到一个很好的近似值:http://www-math.mit.edu/~hajiagha/NodePlanarSteiner.pdf