选择矩形以最大化区域

时间:2016-12-06 12:30:24

标签: c++ algorithm matrix optimization geometry

我有一个任意大小的二维二进制矩阵。我想在这个矩阵中找到一组矩形,显示最大面积。约束是:

  • 矩形可能只覆盖矩阵中的“0”字段而没有“1”字段。
  • 每个矩形必须与下一个矩形具有给定的距离。

让我用这个矩阵进一步说明这一点:

1 0 0 1
0 0 0 0
0 0 1 0
0 0 0 0
0 1 0 0

让两个矩形之间的最小距离为1.因此,最佳解决方案是选择带角(1,0) - (3,1)和(1,3) - (4,3)的矩形。这些矩形是最小的。彼此相距1个场并且它们不位于“1”场。此外,该解决方案获得了最大区域(6 + 4 = 10)。

如果最小距离为2,则最佳值为(1,0) - (4,0)和(1,3) - (4,3),区域4 + 4 = 8。

直到现在,我找到了类似于这篇文章的矩形: Find largest rectangle containing only zeros in an N×N binary matrix

我将所有这些矩形保存在一个列表中:

list<rectangle> rectangles;

struct rectangle {
    int i,j; // bottom left corner of rectangle
    int width,length; // width=size in neg. i direction, length=size in pos. j direction
};

直到现在,我只考虑过蛮力方法,但当然,我对此并不满意。

我希望你能给我一些关于如何在我的list找到相应矩形的提示和提示,我希望你的问题很明确。

1 个答案:

答案 0 :(得分:2)

以下反例表明,即使对最大面积矩形的所有组合进行强力检查也无法找到最佳值:

110
000
110

在上面的例子中,有2个最大区域矩形,每个区域3,一个垂直和一个水平。你不能同时选择这两个,所以如果你只能选择这些矩形的一个子集,那么你所能做的最好就是选择一个总面积为3的一个。但如果你选择了垂直区域 - 3个矩形,然后也取非最大的1x2矩形,只包含最左边的两个0,你可以得到一个更好的总面积5.(这是最小间隔距离为0;如果最小间隔距离是1,就像你自己的例子一样,那么你可以选择最左边的0作为1x1矩形,总面积为4,这仍然优于3。)

对于分隔距离为0的特殊情况,有一个简单的算法:您可以简单地在矩阵中的每个0上放置1x1矩形。当分隔距离严格大于0时,我还没有看到快速算法,尽管我现在不太确定这个问题是NP难的,而不是几分钟之前...