用数组下标表示每一块的编号,对于每一次切割,只需从数组中取出对应块的长宽,然后将该块之后的所有块向前移动一个位置,即编号减1.对于取出的块,顺时针依次判断寻找切割点,然后将新生成的两块按从大到小的顺序填入数组即可.最后,统一计算各块的面积,排序后输出,OK.
Source:
#include<iostream>
using namespace std;
int cmp(const void *a,const void *b);
struct Node
{
int w,h;
};
int area[110],n,p,s,i,j,k,wi,hi;
Node data[110];
int main()
{
while(1)
{
cin>>n>>data[1].w>>data[1].h;
if(n==0 && data[1].w==0 && data[1].h==0)break;
for(i=0,k=1;i<n;++i,k++)
{
cin>>p>>s;
wi=data[p].w;
hi=data[p].h;
for(j=p;j<k;++j)
{
data[j].w=data[j+1].w;
data[j].h=data[j+1].h;
}
while(1)
{
if(s<wi)
{
if(wi-s<s)
{
data[k].w=wi-s;
data[k].h=hi;
data[k+1].w=s;
data[k+1].h=hi;
}else
{
data[k].w=s;
data[k].h=hi;
data[k+1].w=wi-s;
data[k+1].h=hi;
}
break;
}else
s-=wi;
if(s<hi)
{
if(hi-s<s)
{
data[k].w=wi;
data[k].h=hi-s;
data[k+1].w=wi;
data[k+1].h=s;
}else
{
data[k].w=wi;
data[k].h=s;
data[k+1].w=wi;
data[k+1].h=hi-s;
}
break;
}else
s-=hi;
}
}
for(i=0;i<k;++i)
area[i]=data[i+1].w*data[i+1].h;
qsort(area,k,sizeof(int),cmp);
for(i=0;i<k-1;++i)cout<<area[i]<<' ';
cout<<area[k-1]<<endl;
}
}
int cmp(const void *a,const void *b)
{
return *((int*)a)-*((int*)b);
}