找到包含所有矩形的最小区域

时间:2012-09-17 08:14:05

标签: c algorithm math area

这是一个面试问题 我们给出了各种矩形的尺寸,我们必须找出可以包围所有矩形的矩形区域(最小值)?矩形也可以旋转。

test case:-
input:
3   //number of rectangles
8 8
4 3
3 4

output:
88

11x8:
+ - - - - - - + + - +
|             | |   |
|             | |   |
|             | + - +
|             | + - +
|             | |   |
|             | |   |
+ - - - - - - + + - +

我看了fitting rectangles in the smallest possible area之前提出的类似问题 上述方法着眼于所有可能性,旋转,并确定所有布局情况下所有这些可能性的最小值 我们不能建立一个算法,我们首先找到矩形区域的总和,然后寻找最大长度,宽度?

3 个答案:

答案 0 :(得分:7)

这个问题没有绝对的解决方案,但有几个近似的解决方案,你可以阅读其中的一些here

答案 1 :(得分:7)

Optimal Rectangle Packing on Non-Square Benchmarks

  

给定一组矩形,我们的问题是找到所有封闭   最小区域的矩形,包含它们而不重叠。我们   将封闭的矩形称为边界框。优化   问题是 NP-hard ,而决定是否一套问题   矩形可以打包在给定的边界框中 NP-complete ,通过a   从装箱中减少(Korf 2003)。

New Improvements in Optimal Rectangle Packing

  

Korf [2003]将矩形包装问题分为两部分   子问题:最小边界框问题和包含   问题。前者找到了一个可以最小区域的边界框   包含一组给定的矩形,而后者则试图打包   在给定的边界框中给定矩形。解决的算法   最小边界框问题调用解决的算法   遏制问题作为子程序。

最小边界框问题

  

解决最小边界框问题的一种简单方法是找到   最小和最大区域描述可行和可行的集合   潜在的最佳边界框。所有尺寸的包装盒   可以使用此范围内的区域生成,然后进行测试   区域的非递减顺序,直到最小的所有可行解   区域被发现。最小面积是给定面积的总和   矩形。最大面积由a的边界框决定   通过将边界框高度设置为的方式找到的贪婪解决方案   最高的矩形,然后将矩形放在第一个   从左到右扫描时的可用位置   列从下到上扫描。

另见Optimal Rectangle Packing: New Results

答案 2 :(得分:2)

首先你应该检查一下,可以将旋转的矩形旋转还是不旋转? 无论如何,你可以忽略“矩形”条件并解决点中的任务。 你有点数组(矩形的顶点)。你的任务是找到最小面积的包围矩形。 如果无法旋转封闭的矩形,则解决方案是愚蠢的,并且具有复杂度O(n)。

生成矩形数组并制作点阵列,这些点是矩形的顶点。 接下来很简单:

long n; // Number of vertexes
point arr[SIZE]; //Array of vertexes
long minX = MAXNUMBER, minY = MAXNUMBER, maxX = -MAXNUMER, maxY = -MAXNUMBER;
for (long i = 0; i < 4 * n; i++)
{
    minX = MIN(minX, arr[i].x);
    minY = MIN(minY, arr[i].y);
    maxX = MIN(maxX, arr[i].x);
    maxY = MIN(maxY, arr[i].y);
}
long width = maxX - minX, height = maxY - minY;
printf("%ddX%ld", width, height);

如果可以旋转矩形的另一个任务。那你应该先:

  1. 构建矩形中所有点的最小凸多边形。您可以 使用任何现有的algorythms。复杂度O(n log n)。作为“格雷厄姆扫描”的例子:http://en.wikipedia.org/wiki/Graham%27s_scan
  2. 对凸多边形使用简单算法。链接:http://cgm.cs.mcgill.ca/~orm/maer.html
  3. 在wiki中链接您的任务:http://en.wikipedia.org/wiki/Minimum_bounding_rectangle