【问题标题】:fitting rectangles in the smallest possible area在尽可能小的区域内拟合矩形
【发布时间】:2011-07-19 06:30:38
【问题描述】:

IOI 95

四个矩形的六种基本布局

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

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

可能存在满足要求的几个不同的封闭矩形,它们都具有相同的面积。您必须生成所有此类封闭矩形。

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

输出格式
输出文件比解决方案的数量多一行。第一行包含一个整数:包围矩形的最小面积。以下每一行都包含一个由两个数字 p 和 q 描述的解决方案,其中 p

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

【问题讨论】:

  • 不是,事实上我还在上高中,他们现在正在那里教循环。
  • 忽略了IOI的备注,抱歉。
  • 尝试谷歌搜索“受限二维切割算法”。我不确定是否真的只有 24*16 组合。 (尽管您的问题并不完全是通常固定库存的经典切割问题)
  • 排列数:4!,旋转数:2^4
  • 我不知道你可以在这里使用线性排列。例如。看看你的右图:如果右上方的块稍微小一点,你可以把它挤在另外两个之间的空隙里。也就是说,我认为线性顺序和二维排列之间没有 1:1 的映射关系。

标签: algorithm


【解决方案1】:

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

您可以先将 6 种布局案例中的矩形命名为 1、2、3、4。 然后,您应该能够为给定的矩形 1...4 实例计算每个布局的边界框(提示第一种情况:宽度 = 1...4 的宽度之和,高度 = 高度的最大值1...4)

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

【讨论】:

    【解决方案2】:

    由于只有四个矩形,所有可能的布局的枚举应该可以工作。 当然真的所有可能的布局都太多了,但是我们可以合并等价的布局。

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

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

    当我们选择第二个矩形(三个中的一个)时,它的上边框可以接触边界框的上边框或第一个矩形的下边框 - 2 个选项。类似地,它的左边框可能会触及边界框的左边框或第一个矩形的右边框 - 还有 2 个选项。这样我们就得到了 2x2=4 的左上顶点坐标选项。

    第三个和第四个矩形以此类推。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-03-29
        • 1970-01-01
        • 2018-09-14
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 2013-03-01
        相关资源
        最近更新 更多