Algorithm 网格通过性测试

Algorithm 网格通过性测试,algorithm,graph,grid,Algorithm,Graph,Grid,考虑一下这个问题: 定义了一个正方形网格,每个瓷砖要么可以通行(1),要么不能通行(0)。 首先,我们在网格中有一个简单连接的空间,有一个不可逾越的边界,如下所示: 然后,我们开始将各种尺寸的不可通行障碍物(例如1x1、2x2等)放置在可通行空间内。放置每个障碍物后,我们需要测试剩余的可通行空间是否仍然连接(即,确保我们没有将可通行空间拆分为两个或多个断开的空间)。瓷砖也是对角连接的 关键是,在每个障碍物放置后,每个剩余的可通行瓷砖都有一条路径将其连接到其他剩余的可通行瓷砖 我知道在可能断开的

考虑一下这个问题:

定义了一个正方形网格,每个瓷砖要么可以通行(1),要么不能通行(0)。 首先,我们在网格中有一个简单连接的空间,有一个不可逾越的边界,如下所示:

然后,我们开始将各种尺寸的不可通行障碍物(例如1x1、2x2等)放置在可通行空间内。放置每个障碍物后,我们需要测试剩余的可通行空间是否仍然连接(即,确保我们没有将可通行空间拆分为两个或多个断开的空间)。瓷砖也是对角连接的

关键是,在每个障碍物放置后,每个剩余的可通行瓷砖都有一条路径将其连接到其他剩余的可通行瓷砖

我知道在可能断开的点之间搜索路径的可能性,但我担心这可能效率太低。我感兴趣的是尽可能快地进行测试


谢谢你的帮助

实施洪水填充算法。作为执行填充的副作用,计算填充的方块数。放置障碍物后,从任何开放的方块开始执行另一次泛洪填充,并将填充的方块数与原始数字减去作为障碍物放置的方块数进行比较。如果它们不相同,则表示区域已断开。

这可以使用不相交的集合数据结构在摊销O(| V |)时间内完成,其中V是可通行空间中的元素数(该部分的第二段)。引证是对的


这与渐近复杂性相同,并且可能更难实现,因此我同意这一点。:)

此解决方案适用于添加顶点而不是删除顶点。然而,如果它能以某种方式用于去除边缘,它将比
O(| V |)
更有效。您将首次对
O(| V |)
进行预处理,但对于添加的每个障碍物,它将比
O(| V |)
快得多。它将是
O(alpha(n))
其中
alpha
是相反的,每个实际输入的whcih小于4。但我不确定你们是否能利用它来删除边缘。好的,我读得很草率。我真的不知道是否有办法使用union find(及其反向Ackermann运行时)来删除边……它需要某种技巧,比如构造一个对偶图(不是那样,那是行不通的)。