算法(C /图论)

我几天都在努力解决算法问题,我尝试了很多方法来解决它,但是它们不准确/不够快,所以我依靠你 – 我正在寻找技巧或者什么会有所帮助.

所以问题是如下,有方形的二维bool数组

bool array[n][n] (n <= 1000)

正如你可以假设的那样,它充满了1和0,但总是按矩形分组,如下所示:

11100
11100
00001
11100

该算法可以将两个零变为一个并形成尽可能大的形状(形成的形状不必是矩形)并返回形成该形状的数量.对角线连接不计算在内.

例如:

101
010
101

应该返回7.问题是,这个算法应该尽可能快地工作,假设1000×1000阵列将成为上边界1-2秒.所以我尝试过:

>首先,我将一个方块分组成组,形成一个大小和角的X,Y的数组.然后我正在检查它们之间的关系,但很难有效地找到具有最大潜力的组(特别是当给定的数组像棋盘时).我只是一个接一个地检查这些组,检查它们的相邻组,然后检查下一组,再放一个.这就像蛮力,因此检查大约500 000(对于1000×1000棋盘)组太多了.
>我尝试的另一种方法是为每个零点创建一个包含邻居的数组,但找到另一组数据非常不理想,再次,这是一种蛮力.

如果有任何错误,我很抱歉我的英语,我不是母语人士.所以你有任何技巧,任何算法或类似问题的链接?也许有人会写一个(伪)代码?你能做些什么来帮忙,我将不胜感激.

最佳答案 我遇到的第一件事就是蛮力.但是500,000 x 500,000个包含零的单元确实会太慢.

所以我想到了这一点:对于每个包含零的单元格,通过将其设置为1来计算出可以加入多少1个.创建一个名为OnTurning的对象来表示此操作.从最大的地区排名下来.然后,对于每对OnTurnings,按其区域大小总和的粗略顺序,计算出它们的并集大小.当OnTurnings的区域大小总和小于您迄今为止找到的最大联合时,停止搜索.

点赞