矩形的最小矩形数量?

时间:2013-11-26 14:45:40

标签: algorithm geometry

我不确定是否有可以解决此问题的算法。

给定数量的矩形从左到右水平并排放置以形成形状。给出每个的宽度和高度。

您如何确定覆盖整个形状所需的最小矩形数? 即如何使用尽可能少的矩形重绘这个形状?

我只能考虑尽可能地挤出尽可能多的大矩形,但这似乎效率低下。 有什么想法吗?

编辑: 您将获得一个数字n,然后是n个尺寸: 2 1 3 2 5

以上将有两个尺寸为1x3和2x5的矩形彼此相邻。 我想知道在矩形不能重叠的情况下,最不需要重建多少个矩形。

rectangles

2 个答案:

答案 0 :(得分:6)

由于矩形排列良好,因此问题更容易解决。您可以从下往上创建矩形。每次执行此操作时,都会创建要检查的新形状。好消息是,所有你的新形状都是基础对齐的,你可以根据需要重复。


首先,您要查找最小高度矩形。制作一个高度为矩形的矩形,宽度为形状的总宽度。从形状的底部切下那么多。

你将留下多种形状。对于每一个,做同样的事情。

找到最小高度矩形应为O(n)。因为你为每个组都这样做,最坏的情况是不同的高度。总计为O(n 2 )。

例如:

reducing rectangles

在图像中,每个形状的最小值以绿色突出显示。生成的矩形在右侧是蓝色。所需的矩形总数是图像中蓝色矩形的总数,7。


请注意,我正在解释这就好像这些是物理矩形。在代码中,您可以完全取消宽度,因为除非您想要输出矩形而不是仅计算所需的数量,否则它至少无关紧要。

您还可以缩小“制作矩形并将其从形状中剪切”,以简单地从构成该形状/子形状的每个矩形中减去高度。这样做的每个连续的形状部分+ ve高度将组成一个新的子形状。

答案 1 :(得分:5)

如果您查找关于一般问题的算法的概述,Rectangular Decomposition of Binary Images(Tomas Suk,CyrilHöschl和Jan Flusser的文章)可能会有所帮助。它比较了不同的方法:行方法,四叉树,最大内切块,基于变换和图形的方法。

一个多汁的人物(来自第11页)作为开胃菜:

Figure 5 (a) The binary convolution kernel used in the experiment. (b) Its 10 blocks of GBD decomposition.

图5:(a)实验中使用的二进制卷积内核。 (b)其10个GBD分解块。