在尽可能小的区域拟合矩形

时间:2011-03-20 19:59:37

标签: algorithm

  

IOI 95

     

basic layouts

     

四个矩形的六种基本布局

     

给出了四个矩形。找到最小的封闭(新)矩形,这四个矩形可以装入这些矩形而不重叠。最小的矩形是指面积最小的矩形。

     

所有四个矩形的边应平行于包围矩形的相应边。图1显示了将四个矩形组合在一起的六种方法。这六种是唯一可能的基本布局,因为任何其他布局都可以通过旋转或反射从基本布局中获得。在包装过程中,矩形可以旋转90度。

     

可能存在满足要求的几个不同的封闭矩形,所有这些矩形具有相同的区域。你必须生成所有这样的封闭矩形。

     

输入格式
  四条线,每条线包含两个正空格分隔的整数,表示矩形两边的长度。矩形的每一边至少为1,最多为50。

     

输出格式
  输出文件包含的行多于解决方案的数量。第一行包含一个整数:包围矩形的最小区域。以下每行包含由两个数字p和q描述的一个解,其中p <= q。这些行必须按p的升序排序,并且必须全部不同。

所以这是问题陈述。我想我想尝试所有这些基本布局的所有24 * 16位置(你可以将矩形转90度)并检查新区域,但是我不知道如何实现它。从一些伪代码到文章链接的任何东西都会有很大帮助。提前谢谢。

3 个答案:

答案 0 :(得分:5)

虽然谷歌确实提供了一些解决方案,但我想一些高级别的描述将使您能够自己解决这个问题。

您可以从6个布局情况1,2,3,4中的每一个中命名矩形开始。 那么你应该能够为给定的矩形1 ... 4的实例计算每个布局的边界框(第一种情况的提示:宽度=宽度的总和为1 ... 4,高度=最大的高度为1 ... 4)

然后,正如你所说,你可以尝试所有可能的组合,命名四个给定的矩形,索引1 ... 4加上每个这样的可能性尝试所有可能的旋转,并确定所有布局中所有这些可能性的最小值例。

答案 1 :(得分:2)

由于只有四个矩形,因此所有可能布局的枚举都应该有效。 当然,所有可能的布局都太多了,但我们可以合并相同的布局。

我们只考虑每个矩形不能向左和向上移动的布局。这意味着它的上边界接触某些东西,它的左边界接触某些东西。所有其他布局都可以转换为这样的子集,而不会使边界框更大。

当我们选择第一个矩形(四个中的一个)时,它只能触及边界框的左边和上边框,所以我们只有一个可能的左顶顶点位置。

当我们选择第二个矩形(三个中的一个)时,其顶部边框可能会触及边界框的顶部边框或第一个矩形的底部边框 - 2个选项。同样,它的左边框可以触摸边界框的左边框或第一个矩形的右边框 - 另外2个选项。因此,我们为其左上顶点的坐标获得了2x2 = 4个选项。

依旧是第三和第四个矩形。

当然,我们应该检查每个步骤,矩形之间没有交叉(例如,如果它们都从边界框的左上角开始)。此外,我们有时会得到明显非最佳的布局(例如,当第二个矩形的左上顶点与第一个矩形的右下顶点重合时),但这不会对结果产生影响,如果解决方案不够快,可以将其删除

答案 2 :(得分:0)

基本上所有24 * 16组合的给定矩形都可以从上面的6个图中得出,通过考虑反射和旋转,甚至是矩形的排列