如何确定何时删除网格上的点会创建2个不同的未连接区域

时间:2011-06-03 02:47:14

标签: java algorithm graph graph-theory

我正在处理网格上的正方形。网格如果具有或多或少的无限大小。网格方块可以具有两种状态中的一种,无论是声明的还是无人认领的。正方形的坐标作为正方形存储在R树中以便快速访问。然而,在广场无人认领之前,我想迭代通过附近声称的方块,以确保通过取消这个方块,我不会将声明的方块分成2个不同的区域。重要的是要注意,只有当方块触及已经声明的方块时,方块才可以申请。

所以,如果我有类似

的东西

+++++++++

如果玩家想要删除正方形以创建

++++ ++++

然后我希望能够检测并拒绝此操作。当然,这也需要能够处理完整的二维空间(我试过,但发现很难通过我在这里可用的格式来解决这个问题)。这也必须相当有效。有关要查找的算法名称的任何指针或有关如何执行此操作的说明都非常棒< 3

2 个答案:

答案 0 :(得分:0)

对已移除的网格点的邻居进行广度优先搜索,并查看所有搜索都相互匹配。

搜索没有删除网格点的组件,直到您将其耗尽(原始声明的区域)或在另一个位置遇到其他广度优先搜索。

例如,如果左侧有区域,右侧有删除结果:

+++     + +
+ +     + +
+ +  -> + +
+++     +++

(顶部中间被移除)

现在做两个广度的第一次平行搜索:(数字或字母表示从被移除的部分中移动的方格数)

1 a
2 b
3 c
4xd

在广度优先搜索的第5步中将到达x处的连接,表示删除顶部中间网格不会创建两个单独的区域。

答案 1 :(得分:0)

我认为你想要的是Connected Component Labeling(维基百科页面有算法的伪代码)。在删除正方形之前和之后计算区域:如果数字发生变化,您就知道不允许移动。