这是一个面试问题 我们给出了各种矩形的尺寸,我们必须找出可以包围所有矩形的矩形区域(最小值)?矩形也可以旋转。
test case:-
input:
3 //number of rectangles
8 8
4 3
3 4
output:
88
11x8:
+ - - - - - - + + - +
| | | |
| | | |
| | + - +
| | + - +
| | | |
| | | |
+ - - - - - - + + - +
我看了fitting rectangles in the smallest possible area之前提出的类似问题 上述方法着眼于所有可能性,旋转,并确定所有布局情况下所有这些可能性的最小值 我们不能建立一个算法,我们首先找到矩形区域的总和,然后寻找最大长度,宽度?
答案 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的边界框决定 通过将边界框高度设置为的方式找到的贪婪解决方案 最高的矩形,然后将矩形放在第一个 从左到右扫描时的可用位置 列从下到上扫描。
答案 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);
如果可以旋转矩形的另一个任务。那你应该先:
在wiki中链接您的任务:http://en.wikipedia.org/wiki/Minimum_bounding_rectangle