/*
ID: 551100k1
LANG: C++
TASK: packrec
*/
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
struct P{
int x,y;
}s[5],t[5];
vector<P> vec;
int cmp(P a,P b){
return a.x<b.x;
}
int ans=1e8,o[5],v[5]={0},r[5];
void dfs2(int k){
if(k==4){
int X,Y,i;
for(i=0;i<4;i++)
if(r[i]==0) t[i]=s[o[i]];
else t[i].x=s[o[i]].y,t[i].y=s[o[i]].x;
//1
X=0,Y=0;
for(i=0;i<4;i++)
X+=t[i].x,Y=max(Y,t[i].y);
if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
if(X*Y<ans) ans=X*Y,vec.clear();
//2
X=0,Y=0;
for(i=0;i<3;i++)
X+=t[i].x,Y=max(Y,t[i].y+t[3].y);
X=max(X,t[3].x);
if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
if(X*Y<ans) ans=X*Y,vec.clear();
//3
X=0,Y=0;
for(i=0;i<2;i++)
X+=t[i].x,Y=max(Y,t[i].y+t[3].y);
X+=t[2].x;X=max(X,t[3].x+t[2].x);Y=max(Y,t[2].y);
if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
if(X*Y<ans) ans=X*Y,vec.clear();
//4
X=0,Y=0;
X=t[0].x+t[3].x+max(t[1].x,t[2].x);
Y=max(max(t[0].y,t[3].y),t[1].y+t[2].y);
if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
if(X*Y<ans) ans=X*Y,vec.clear();
//5
if(t[1].y>=t[0].y && t[2].x<=t[0].x && t[0].y<=t[1].y){
X=0,Y=0;
X=max(t[0].x+t[1].x,t[2].x+t[3].x);
Y=max(t[0].y+t[2].y,t[1].y+t[3].y);
if(X*Y==ans) vec.push_back((P){min(X,Y),max(X,Y)});
if(X*Y<ans) ans=X*Y,vec.clear();
}
return;
}
r[k]=0,dfs2(k+1);
r[k]=1,dfs2(k+1);
}
void dfs(int k){
int i;
if(k==4){
dfs2(0);
return;
}
for(i=0;i<4;i++)
if(v[i]==0)
v[i]=1,o[k]=i,dfs(k+1),v[i]=0;
}
int main(){
freopen("packrec.in","r",stdin);
freopen("packrec.out","w",stdout);
int i;
for(i=0;i<4;i++)
scanf("%d%d",&s[i].x,&s[i].y);
dfs(0);
printf("%d\n",ans);
sort(vec.begin(),vec.end(),cmp);
for(i=0;i<vec.size();i++)
if(!i || vec[i].x>vec[i-1].x)
printf("%d %d\n",vec[i].x,vec[i].y);
}
沒有留言:
張貼留言