题意:
已知4个矩形的l和w 矩形可以旋转和平移 用一块最小面积的新的矩形覆盖4个矩形
求最小的面积 以及新矩形的l和w
思路:
题目已经给出6种摆放方式 按它的方式摆即可
我们要枚举4个矩形是否旋转(只转90度)过 然后枚举每种摆放方式中矩形的编号
代码中的枚举方法是二进制枚举旋转 全排列枚举编号
最后计算所有情况中的答案
第6种摆放方式比较难想 大致思路就是 先放下面两块 在根据下面两块的高度分别讨论上面两块如何摆放
/*
ID: housera1
PROG: packrec
LANG: C++
*/
#include
#include
#include
using namespace std;
struct rectangle
{
int l,w;
}f[5];
pair sol[5005];
int n,ans=2147483640;
int order[5];
int main(){
int Debug=0;
if(!Debug){
freopen("packrec.in","r",stdin);
freopen("packrec.out","w",stdout);
}
int i,j,x,y;
for(i=0;i<4;i++) scanf("%d%d",&f[i].l,&f[i].w);
for(i=0,n=0;i<16;i++)
{
for(j=0;j<4;j++) if(i&(1<y) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w+f[order[3]].w);
y=f[order[0]].l+max(f[order[1]].l,max(f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*yy) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w+f[order[2]].w)+f[order[3]].w;
y=max(f[order[0]].l+max(f[order[1]].l,f[order[2]].l),f[order[3]].l);
if(x*y<=ans)
{
if(x*yy) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=f[order[0]].w+max(f[order[1]].w,f[order[2]].w)+f[order[3]].w;
y=max(f[order[0]].l,max(f[order[1]].l+f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*yy) swap(x,y);
sol[n++]=make_pair(x,y);
}
x=max(f[order[0]].w,f[order[1]].w)+f[order[2]].w+f[order[3]].w;
y=max(f[order[0]].l+f[order[1]].l,max(f[order[2]].l,f[order[3]].l));
if(x*y<=ans)
{
if(x*yy) swap(x,y);
sol[n++]=make_pair(x,y);
}
if(f[order[1]].l==f[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[0]].w+f[order[3]].w);
else if(f[order[1]].lf[order[2]].l) x=max(f[order[1]].w+f[order[2]].w,f[order[3]].w+max(f[order[0]].w,f[order[1]].w));
y=max(f[order[0]].l+f[order[1]].l,f[order[2]].l+f[order[3]].l);
if(x*y<=ans)
{
if(x*yy) swap(x,y);
sol[n++]=make_pair(x,y);
}
}while(next_permutation(order,order+4));
for(j=0;j<4;j++) if(i&(1<