【发布时间】:2017-04-21 02:23:06
【问题描述】:
我有一个任意大小的二维二进制矩阵。我想在这个矩阵中找到一组矩形,显示最大面积。约束是:
- 矩形只能覆盖矩阵中的“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 中找到对应的矩形,希望你能清楚我的问题。
【问题讨论】:
-
限制矩形不是正方形?它可以有 area=1 吗?
-
它不一定是正方形,但在我的代码中,我对矩形的长度和宽度有限制。出于我的目的,矩阵至少为 50x50 大,矩形的最小尺寸为 3x3。
-
整数编程是一种选择吗?
-
哦,实际上我不得不承认我对整数规划的了解并不多。您能否在给定的上下文中非常简要地解释一下您的意思?
标签: c++ algorithm matrix optimization geometry