【发布时间】:2011-12-26 21:15:52
【问题描述】:
简化,我要解决以下问题:
你有一个用 0 和 1 填充的二维数组。找到最小数量的矩形,使得它们覆盖所有 1。矩形不应重叠。
函数签名可能如下所示:
List<Rectangle> FindCoveringRectangles(bool[,] array)
我已经有一个“足够好”的解决方案,但并不总是找到最小数量的矩形。我想知道是否有一些众所周知的高效算法可以用来解决这个问题?
例子:
输入数组:
..........
.1.....11.
.......11.
...111....
...111....
...111....
....1111..
....1111..
......11..
..........
(为了便于阅读,用点替换 0)
可能会产生以下矩形:
(2,2,2,2),
(2,8,3,9),
(4,4,6,6),
(7,5,8,8),
(9,7,9,8)
(上、左、下、右),从 1 开始
可以有不止一种解决方案,但一种就足够了。
【问题讨论】:
-
如果您告诉我们您的近似算法,也许我们可以在最坏的情况下帮助改进它。
-
你想优化什么?矩形的最小数量始终为 1。
-
这个问题在Karnaugh maps的上下文中很好的解决了。
-
@ThomasAhle:卡诺图具有更高维度(8x8、16x16 等)和更多变量。虽然精确的 Quine-McCluskey 方法是 NP 难的,但 Espresso 启发式应该会给出很好的结果。由于对该主题的了解有限,我无法提供完整的细节,但我知道卡诺图被广泛使用并且与手头的主题非常相似。
-
@ThomasMcLeod:你只覆盖那些。
标签: algorithm