记录编号 37371 评测结果 AAAAAAAAAAAAAAAAAAAAA
题目名称 铺放矩形块 最终得分 100
用户昵称 GravatarCzb。 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2012-03-28 20:20:18 内存使用 0.27 MiB
显示代码纯文本
#include<stdio.h>
#include<stdlib.h>

int ans,top,t[5],a[5][2],x[5],y[5];

bool flag[5];

struct orz
{
	int x,y;
}f[1000];

inline int max(int a,int b)
{
	return a>b?a:b;
}

inline int min(int a,int b)
{
	return a<b?a:b;
}

void swap(int &a,int &b){a^=b^=a^=b;}

void solve()
{
	int xx,yy;
	//------case1------
	xx=yy=0;
	for(int i=1;i<=4;i++)
	{xx+=x[i];yy=max(yy,y[i]);}
	if(xx>yy)swap(xx,yy);
	if(xx*yy<ans){ans=xx*yy;top=1;f[1].x=xx;f[1].y=yy;}
	else if(xx*yy==ans){top++;f[top].x=xx;f[top].y=yy;}
	//------case2------
	xx=yy=0;
	for(int i=1;i<=3;i++)
	{xx+=x[i];yy=max(yy,y[i]);}
	xx=max(xx,x[4]);yy+=y[4];
	if(xx>yy)swap(xx,yy);
	if(xx*yy<ans){ans=xx*yy;top=1;f[1].x=xx;f[1].y=yy;}
	else if(xx*yy==ans){top++;f[top].x=xx;f[top].y=yy;}
	//------case3------
	xx=yy=0;
	xx=x[1]+x[2];yy=max(y[1],y[2]);
	xx=max(xx,x[3]);yy+=y[3];
	xx+=x[4];yy=max(yy,y[4]);
	if(xx>yy)swap(xx,yy);
	if(xx*yy<ans){ans=xx*yy;top=1;f[1].x=xx;f[1].y=yy;}
	else if(xx*yy==ans){top++;f[top].x=xx;f[top].y=yy;}
	//------case4------
	xx=yy=0;
	xx=max(x[1],x[2]);yy=y[1]+y[2];
	xx+=x[3];yy=max(yy,y[3]);
	xx+=x[4];yy=max(yy,y[4]);
	if(xx>yy)swap(xx,yy);
	if(xx*yy<ans){ans=xx*yy;top=1;f[1].x=xx;f[1].y=yy;}
	else if(xx*yy==ans){top++;f[top].x=xx;f[top].y=yy;}
	//------case5------
	xx=yy=0;
	xx=max(x[1]+x[3],x[2]+x[4]);
	if(x[3]<x[4]&&x[1]>x[2]&&y[1]<y[3]&&y[2]>y[4])yy=max(y[1]+y[2],y[3]+y[4]);
	else yy=max(y[1],y[3])+max(y[2],y[4]);
	if(xx>yy)swap(xx,yy);
	if(xx*yy<ans){ans=xx*yy;top=1;f[1].x=xx;f[1].y=yy;}
	else if(xx*yy==ans){top++;f[top].x=xx;f[top].y=yy;}
}

void work()
{
	for(int i=0;i<=1;i++)
	{
		for(int j=0;j<=1;j++)
		{
			for(int k=0;k<=1;k++)
			{
				for(int l=0;l<=1;l++)
				{
					x[1]=a[t[1]][i];
					y[1]=a[t[1]][!i];
					x[2]=a[t[2]][j];
					y[2]=a[t[2]][!j];
					x[3]=a[t[3]][k];
					y[3]=a[t[3]][!k];
					x[4]=a[t[4]][l];
					y[4]=a[t[4]][!l];
					solve();
				}
			}
		}
	}
}

void dfs(int k)
{
	if(k>4)
	{
		work();
		return;
	}
	for(int i=1;i<=4;i++)
	{
		if(!flag[i])
		{
			flag[i]=true;
			t[k]=i;
			dfs(k+1);
			flag[i]=false;
		}
	}
}

int cmp(const void *a,const void *b)
{
	return (*(orz *)a).x-(*(orz *)b).x;
}

int main(int argc,char *argv[])
{
	freopen("packrec.in","r",stdin);
	freopen("packrec.out","w",stdout);
	for(int i=1;i<=4;i++)scanf("%d%d",&a[i][0],&a[i][1]);
	ans=~0U>>1;
	dfs(1);
	qsort(f+1,top,sizeof(orz),cmp);
	printf("%d\n",ans);
	for(int i=1;i<=top;i++)if(f[i].x!=f[i-1].x)printf("%d %d\n",f[i].x,f[i].y);
	return 0;
}