USACO Packing Rectangles
这题真BT……. 题解:http://starforever.blog.hexun.com/2097115_d.html 自己最开始毫无头绪,上网搜了题解。。 最后一种情况要仔细考虑,每个矩形还要翻转。。 还要注意输出。
/*
ID: djgreen1
LANG: C
PROB: packrec
*/
#include <stdio.h>
#include <stdbool.h>
struct box
{
int h,w;
};
struct box rectangle[6],rect[6],ans[6];
bool used[6],ro[6];
int p,s=10000,w,h;
int max(int a,int b)
{
if (a>b) return a;
else return b;
}
void judge()
{
int i,j,temp;
if (w>h)
{
temp=w;
w=h;
h=temp;
}
if (w*h<=s)
{
if (w*h==s)
{
for (i=1;i<=p;i++)
if (w==ans[i].w) return;
for (i=1;i<=p;i++)
if (w<ans[i].w)
{
for (j=p+1;j>i;j--)ans[j]=ans[j-1];
ans[i].w=w;
ans[i].h=h;
p++;
return;
}
p++;
ans[p].h=h;
ans[p].w=w;
}
else
{
s=w*h;
p=1;
ans[p].h=h;
ans[p].w=w;
}
}
}
void work()
{
//Case 1
w=rect[1].w+rect[2].w+rect[3].w+rect[4].w;
h=max(rect[1].h,rect[2].h);
h=max(h,rect[3].h);
h=max(h,rect[4].h);
judge();
//Case 2
w=max(rect[1].w+rect[2].w+rect[3].w,rect[4].w);
h=max(rect[1].h,rect[2].h);
h=max(h,rect[3].h);
h+=rect[4].h;
judge();
//Case 3
w=max(rect[1].w+rect[2].w,rect[3].w)+rect[4].w;
h=max(max(rect[1].h,rect[2].h)+rect[3].h,rect[4].h);
judge();
//Case 4
w=rect[1].w+max(rect[2].w,rect[3].w)+rect[4].w;
h=max(rect[1].h,rect[4].h);
h=max(h,rect[2].h+rect[3].h);
judge();
//Case 6
if (rect[3].h>=rect[2].h+rect[4].h)
{
w=max(rect[3].w+rect[2].w,rect[3].w+rect[4].w);
w=max(w,rect[1].w);
h=rect[1].h+rect[3].h;
judge();
return;
}
if (rect[3].h>rect[4].h)
{
w=max(rect[1].w+rect[2].w,rect[2].w+rect[3].w);
w=max(w,rect[4].w+rect[3].w);
h=max(rect[1].h+rect[3].h,rect[2].h+rect[4].h);
judge();
return;
}
if (rect[3].h==rect[4].h)
{
w=max(rect[1].w+rect[2].w,rect[3].w+rect[4].w);
h=max(rect[1].h,rect[2].h)+rect[3].h;
judge();
return;
}
if (rect[3].h<rect[4].h && rect[4].h<rect[3].h+rect[1].h)
{
w=max(rect[1].w+rect[2].w,rect[1].w+rect[4].w);
w=max(w,rect[3].w+rect[4].w);
h=max(rect[1].h+rect[3].h,rect[2].h+rect[4].h);
judge();
return;
}
w=max(rect[2].w,rect[1].w+rect[4].w);
w=max(w,rect[3].w+rect[4].w);
h=rect[4].h+rect[2].h;
judge();
}
void exchange(int i)
{
int temp;
temp=rect[i].h;
rect[i].h=rect[i].w;
rect[i].w=temp;
}
void rotate(int depth)
{
if (depth==5)
{
work();
return;
}
if (!ro[depth])
{
ro[depth]=true;
exchange(depth);
rotate(depth+1);
ro[depth]=false;
exchange(depth);
rotate(depth+1);
}
}
void search(int depth)
{
int i;
if (depth==5)
{
rotate(1);
return;
}
for (i=1;i<5;i++)
{
if (!used[i])
{
rect[depth]=rectangle[i];
used[i]=true;
search(depth+1);
used[i]=false;
}
}
}
int main()
{
int i;
FILE *in=fopen("packrec.in","r"),*out=fopen("packrec.out","w");
memset(ans,0,sizeof(ans));
for (i=1;i<5;i++) fscanf(in,"%d%d",&rectangle;[i].h,&rectangle;[i].w);
fclose(in);
search(1);
fprintf(out,"%d\n",s);
for (i=1;i<=p;i++)
{
fprintf(out,"%d %d\n",ans[i].w,ans[i].h);
}
fclose(out);
}
```
comments powered by Disqus