pku3327

用数组下标表示每一块的编号,对于每一次切割,只需从数组中取出对应块的长宽,然后将该块之后的所有块向前移动一个位置,即编号减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);

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值