Algorithm 在二维数组中连接不相交集

Algorithm 在二维数组中连接不相交集,algorithm,grid,path-finding,disjoint-sets,disjoint-union,Algorithm,Grid,Path Finding,Disjoint Sets,Disjoint Union,我试图生成一个随机网格,其中包含可遍历和不可遍历的位置,并确保在4个方向之一{右、上、左、下}上有一条从一个可遍历位置到任何其他可遍历位置的路径。可遍历位置表示为“[]”,不可遍历位置表示为“[X]” 我可以使用什么算法在网格中查找不相交集并在不相交集之间创建路径?谢谢 要查找不相交的组件,可以从任何可遍历位置开始使用广度优先搜索(使用队列)或深度优先搜索(使用堆栈)。当搜索终止时,它将标记整个组件。然后,如果有未标记的位置,则使用这些位置作为另一次搜索的起点,等等,直到您标记了所有可遍历的位置

我试图生成一个随机网格,其中包含可遍历和不可遍历的位置,并确保在4个方向之一{右、上、左、下}上有一条从一个可遍历位置到任何其他可遍历位置的路径。可遍历位置表示为“[]”,不可遍历位置表示为“[X]”


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

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

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

该方法不能保证找到连接可遍历位置所需的最小X数;例如,在您给出的图表中,删除右上角附近的单个X连接三个组件,而我的建议可能导致删除两个X。然而,你的问题是含糊不清的,所以我相信区别并不重要


要找到要删除的X的确切最小数目,您必须解决“节点加权Steiner树问题”,我相信这通常是NP难的。考虑到图形是平面的,您可能能够得到一个很好的近似值:。

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

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

该方法不能保证找到连接可遍历位置所需的最小X数;例如,在您给出的图表中,删除右上角附近的单个X连接三个组件,而我的建议可能导致删除两个X。然而,你的问题是含糊不清的,所以我相信区别并不重要


要找到要删除的X的确切最小数目,您必须解决“节点加权Steiner树问题”,我相信这通常是NP难的。考虑到图形是平面的,您可能能够得到一个很好的近似值:。

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

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

该方法不能保证找到连接可遍历位置所需的最小X数;例如,在您给出的图表中,删除右上角附近的单个X连接三个组件,而我的建议可能导致删除两个X。然而,你的问题是含糊不清的,所以我相信区别并不重要


要找到要删除的X的确切最小数目,您必须解决“节点加权Steiner树问题”,我相信这通常是NP难的。考虑到图形是平面的,您可能能够得到一个很好的近似值:。

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

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

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][ ]