找到覆盖网格中1的矩形的最小矩形

时间:2013-11-23 16:11:37

标签: algorithm math language-agnostic geometry

假设我有一个包含1和0的网格...我怎样才能找到最短的矩形列表(实际上,边界),它们一起覆盖所有的1并且不包括任何0?

目前,我反复找到网格中最大的矩形,存储它的尺寸,并将区域中的所有单元格设置为0,直到它们都设置为0.

我的两个问题是:它似乎非常有效,我似乎无法证明它实际上覆盖了最少矩形的区域,但我找不到任何反驳它的场景。

更新:我发现一个网格反驳了我描述的方法......

0000000
0000010
0111110
0000010
0000000

1的水平字符串是现有的最大矩形,但一旦删除,它会将1的垂直字符串分成两个小矩形......显然,这可以用2个矩形来解决。

1 个答案:

答案 0 :(得分:0)

解决方案空间的一般深度优先搜索可能不是最有效的,但会找到答案。您甚至可以输出每个解决方案(例如,您显示的网格有两个解决方案,其中每个'1'仅使用两个三角形覆盖。)这应该很容易实现,然后您可以将其用作基线来与其他方法,既测试它们的正确性又比较时间。

对当前方法进行略微修改将解决该示例网格:根据其覆盖的当前未覆盖的方块数找到“最大”网格,而不是将方块更改为“0”具有单独的状态,意味着'1 '但已经涵盖了。这样后来的矩形可以跨越这些正方形,但已经覆盖的正方形不计入使矩形“更大”。 (当然,只有在允许重叠矩形时才有效。)