题目大意:
给定4个矩形块,找出一个最小的封闭矩形将这4个矩形块放入,但不得相互重叠。所谓最小矩形指该矩形面积最小。
图1 四个矩形的六个基本布局
4个矩形块中任一个矩形的边都与封闭矩形的边相平行,图1显示出了铺放4个矩形块的6种方案。这6种方案是唯一可能的基本铺放方案。因为其它方案能由基本方案通过旋转和镜像反射得到。
可能存在满足条件且有着同样面积的各种不同的封闭矩形,你应该输出所有这些封闭矩形的边长。
解题思路:
这道题的精髓部分在于读题和读图。必须要知道上述6种基本布局已经包括所有的情况。然后就是对每种布局一一枚举了。前面5种布局的判断很简单,主要是第六种布局,需要仔细考虑。
下面是一个分析,对每种布局有很清楚的解释:http://hi.baidu.com/readd123/item/f7c57925d963ab0872863e82
//下面的部分来自上述博客
只要找准几种状态就行了,题目中的6个已经足够了,举每个方块的选择顺序和放置方向就行了。
第4、5个在本质上其实是一样。如图,不同模式对应的最小面积如下:
设w1,w2,w3,w4表示4个方块的横长,h1,h2,h3,h4表示4个方块的纵长。w,h表示最小。
1:w=w1+w2+w3+w4;h=max(h1,h2,h3,h4)
2:w=max(w1+w2+w3,w4);h=max(h1,h2,h3)+h4
3:w=max(w1+w2,w3)+w4;h=max(h1+h3,h2+h3,h4)
4:w=w1+w2+max(w3,w4);h=max(h1,h3+h4,h2)
5:h=max(h1+h3,h2+h4)
对于w,我们细分为如下四种形式:
(1):h3>=h2+h4;w=max(w1,w3+w2,w3+w4)
(2):h3>h4 and h3
(3):h4>h3 and h4
(4):h4>=h1+h3;w=max(w2,w1+w4,w3+w4)
*:h3=h4(图中没画);w=max(w1+w2,w3+w4)
之后便是具体实现了:
/*
ID: [email protected]
PROG: packrec
LANG: C++
*/
//http://hi.baidu.com/readd123/item/f7c57925d963ab0872863e82
#include
#include
#include
#include
#include
#include