[U]Packing Rectangles

來源:互聯網
上載者:User

很久沒有做題了,詳細統計呢有兩個月了。浪費了兩個月做了一些無關痛癢的事情。在這裡對我的隊友說聲對不起了...接下來好好做題吧..盡量多做點多感悟一點。

分析:

這題在題目裡面說得很清楚了,有6種情況,其實這六種情況只是4個矩形的不同擺法。和他的長寬怎麼擺是沒有關係的。其中1-5的情況是固定的,因為這幾種情況比較簡單,每個矩形各自的長寬對集合出的大矩形的長寬影響不大。

下面重點分析的就是第六種:


不用管題中的圖怎麼話,實際上6個圖的意思只是矩形的位置,和長寬放置並沒有關係。認真你就輸了!按這樣放置,其實題中圖的意思也就是上面的那個圖,不論長寬,只分位置。在這樣放置的情況下,初始化寬度;

w=0.w+1.w;

h=max(0.h+3.h,1.h+2.h);

在圖中0,3相連,1,2相連;

特殊情況呢??所謂的特殊情況就是影響初始情況的,稍加分析可以發現有以下情況:

    

根據這幾種特殊情況就可以來判斷了!

/* ID:seven4 LANG:C++ PROB:packrec  */#include<stdio.h>#define INF 0x7FFFFFFFusing namespace std;struct REC{    int h,w;};int max( int a,int b ){ return a>b?a:b; }int max( int a,int b,int c ){ return a>max(b,c)?a:max(b,c); }int max( int a,int b,int c,int d ){ return a>max(b,c,d)?a:max(b,c,d); }int min( int a,int b ){ return a<b?a:b; }int ans;bool flag[100];REC swap( REC R ){ int temp; temp=R.h; R.h=R.w; R.w=temp; return R;}void record( int a,int b ){  if( ans>a*b )  {   ans=a*b;   for( int i=0;i<100;i++ )     flag[i]=false;    }    if( ans==a*b )     flag[min(a,b)]=true;}void check( REC *R ){  REC temp;  temp.h=temp.w=0;  int index=INF;  /*1.*/  temp.w=temp.h=0;  temp.w=max( R[0].w+R[1].w+R[2].w+R[3].w,temp.w );  temp.h=max( R[0].h,R[1].h,R[2].h,R[3].h );  record(temp.w,temp.h);  /*2.*/  temp.w=temp.h=0;  temp.w=max( R[0].w+R[1].w+R[2].w,R[3].h );  temp.h=R[3].w+max( R[0].h,R[1].h,R[2].h );  record(temp.w,temp.h);  /*3.*/  temp.w=temp.h=0;  temp.w=max( R[0].w+R[1].w,R[2].h )+R[3].w;  temp.h=max( R[0].h+R[2].w,R[1].h+R[2].w,R[3].h );  record(temp.w,temp.h);  /*4,5.*/  temp.w=temp.h=0;  temp.w=max( R[1].w,R[2].w )+R[0].w+R[3].w;  temp.h=max( R[0].h,R[3].h,R[1].h+R[2].h );  record(temp.w,temp.h);  /*6.*/  temp.w=R[0].w+R[1].w;  temp.h=max( R[0].h+R[3].h,R[1].h+R[2].h );  if( R[1].h<R[0].h )   temp.w=max( temp.w,R[0].w+R[2].w );  if( R[1].h>R[0].h )   temp.w=max( temp.w,R[1].w+R[3].w ); if( R[1].h<R[3].h+R[0].h )   temp.w=max( temp.w,R[2].w+R[3].w ); temp.w=max( temp.w,R[2].w );   temp.w=max( temp.w,R[3].w );   record(temp.w,temp.h);  /**/}void rotate( REC *R,int num ){  if( num==4 ){ check(R);return ; } R[num]=swap( R[num] ); rotate( R,num+1 ); R[num]=swap( R[num] ); rotate( R,num+1 );}void permutation( REC *R,int num ){  REC r;  if( num==4 )  {   rotate( R,0 );   return ;  }  for( int i=num;i<4;i++ )  {    r=R[num];R[num]=R[i];R[i]=r;    permutation( R,num+1 );    r=R[num];R[num]=R[i];R[i]=r; }}int main(){ freopen( "packrec.in","r",stdin ); freopen( "packrec.out","w",stdout ); REC rec[4];  for( int i=0;i<100;i++ ) flag[i]=0;ans=INF;  for( int i=0;i<4;i++ )  scanf( "%d %d",&rec[i].h,&rec[i].w );    permutation( rec,0 );printf( "%d\n",ans );for( int i=0;i<100;i++ ) if( flag[i] )  printf( "%d %d\n",i,ans/i ); scanf( "%d",&ans ); return 0;}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.