我已经苦苦思考一个算法问题几天了,我尝试了很多方法来解决它,但它们不够准确/快速,所以我指望你了 - 我正在寻找有用的提示或任何东西。
因此,问题如下,有一个布尔值的二维数组方阵
bool array[n][n] (n <= 1000)
正如你所想象的那样,它充满了1和0,但是1总是被分组成矩形,就像这样:
11100
11100
00001
11100
该算法可以将两个零变为一,形成尽可能大的由1组成的形状(形成的形状不必是矩形),并返回组成此形状的1的数量。对角线连接不计入其中。
例如:
101
010
101
应返回 7。问题在于,该算法应尽可能快地工作,比如说对于一个 1000x1000 的数组,上限应为 1-2 秒钟。所以我尝试了以下方法:
1. 首先,我将二进制值为 1 的正方形分组,并形成一个包含它们大小和角落 X、Y 坐标的数组。然后检查它们之间的关系,但很难有效地找到潜力最大的组(特别是当给定的数组就像是一个棋盘时)。我只是一个接一个地检查这些组,检查其相邻组,然后检查下一个组是否有第二个要放置的组件。这就像 brute force,因此检查大约 500,000(对于一个 1000x1000 的棋盘)组就太多了。
2. 我尝试了另一种方法是为每个零创建一个邻居数组,但是很难找到另一个二进制值为 1 的组,这也是 brute force。
如果有任何错误,请谅解我不是母语为英语者。你有什么提示、算法链接或类似问题吗?也许有人可以写出(伪)代码?任何能帮助我的东西,我都会感激。