• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594

            POJ 1169 Packing Rectangles---模擬

            Posted on 2010-08-10 11:57 Uriel 閱讀(516) 評論(0)  編輯 收藏 引用 所屬分類: POJ模擬
                    比較麻煩的模擬,倒不是方法難,主要情況多,過程很簡單,就是題目給的那幾種情況枚舉(開始以為隨便放置,所以一直以為是大自然題,所以放了一年沒做。。),題目的case 4 & case 5 可以合并~

                    每種case都要考慮橫放和豎放兩種情況,最后一種case還要考慮四個矩形的相對位置。。寫了一晚上+一早上。。代碼很挫。。


            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <algorithm>
            using namespace std;

            #define INF 0x7fffffff

            struct Ans{
                
            int w,h,area;
            }
            res[3000];

            bool cmp(Ans a,Ans b){
                
            if(a.area!=b.area)return a.area<b.area;
                
            else
                    
            return a.w<b.w;
            }


            int dir[24][4]={{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,2,1},{0,3,1,2},
                            
            {1,2,3,0},{1,2,0,3},{1,0,2,3},{1,0,3,2},{1,3,2,0},{1,3,0,2},
                            
            {2,0,1,3},{2,0,3,1},{2,1,0,3},{2,1,3,0},{2,3,1,0},{2,3,0,1},
                            
            {3,0,1,2},{3,0,2,1},{3,1,0,2},{3,1,2,0},{3,2,1,0},{3,2,0,1}}
            ;
            int W,H,n;
            int w[5],h[5];

            int main(){
                
            int i,j,k,tmp,cf;
                
            int tw[5],th[5];//case 5 中暫存每個矩形長寬
                int flagw,flagh,flaghh,flagww; //暫存特殊矩形的長寬
                int flag[5]; //case 5 中每個矩形橫放/豎放的情況
                for(i=0;i<4;i++)scanf("%d %d",&w[i],&h[i]);
                n
            =0//num of res

                
            //-----------------------------------case 1
                
            //0->橫放 1->(旋轉(zhuǎn)180)豎放
                for(i=0;i<16;i++){
                    tmp
            =i; cf=4;
                    H
            =0; W=0;
                    
            while(cf--){
                        
            if(tmp&1){
                            W
            +=h[cf]; H=max(w[cf],H);
                        }

                        
            else{
                            W
            +=w[cf]; H=max(h[cf],H);
                        }

                        tmp
            /=2;
                    }
                
            //        printf("W=%d H=%d\n",W,H);
                    if(W>H)swap(W,H);
                    res[n].area
            =W*H;
                    res[n].w
            =W;
                    res[n
            ++].h=H;
                }


                
            //-----------------------------------case 2
                
            //0->橫放 1->(旋轉(zhuǎn)180)豎放
                for(i=0;i<4;i++){
                    
            for(j=0;j<16;j++){
                        tmp
            =j;cf=4;
                        H
            =0;W=0;
                        
            while(cf--){
                            
            if(cf==i){
                                
            if(tmp&1){
                                    flagw
            =h[cf]; flagh=w[cf];
                                }

                                
            else{
                                    flagw
            =w[cf]; flagh=h[cf];
                                }

                            }

                            
            else{
                                
            if(tmp&1){
                                    H
            =max(H,w[cf]); W+=h[cf];
                                }

                                
            else{
                                    H
            =max(H,h[cf]); W+=w[cf];
                                }

                            }

                            tmp
            /=2;
                        }

                        H
            +=flagh;
                        W
            =max(W,flagw);
            //            printf("W=%d H=%d\n",W,H);
                        if(W>H)swap(W,H);
                        res[n].area
            =W*H;
                        res[n].w
            =W;
                        res[n
            ++].h=H;
                    }

                }


                
            //-----------------------------------case 3--------------------WA
                
            //0->橫放 1->(旋轉(zhuǎn)180)豎放
                for(i=0;i<4;i++){
                    
            for(j=0;j<4;j++){
                        
            if(i==j)continue;
                        
            for(k=0;k<16;k++){
                            tmp
            =k;cf=4;
                            W
            =0;H=0;
                            
            while(cf--){
                                
            if(cf==i){
                                    
            if(tmp & 1){
                                        flaghh
            =w[i]; flagww=h[i];
                                    }

                                    
            else{
                                        flaghh
            =h[i]; flagww=w[i];
                                    }

                                }

                                
            else if(cf==j){
                                    
            if(tmp & 1){
                                        flagh
            =w[j]; flagw=h[j];
                                    }

                                    
            else{
                                        flagh
            =h[j]; flagw=w[j];
                                    }

                                }

                                
            else{
                                    
            if(tmp & 1){
                                        W
            +=h[cf]; H=max(H,w[cf]);
                                    }

                                    
            else{
                                        W
            +=w[cf]; H=max(H,h[cf]);
                                    }

                                }

                                tmp
            /=2;
                            }

                            H
            =max(flaghh,H+flagh);
                            W
            =max(W,flagw)+flagww;
            //                printf("W=%d H=%d\n",W,H);
                            if(W>H)swap(W,H);
                            res[n].area
            =W*H;
                            res[n].w
            =W;
                            res[n
            ++].h=H;
                        }

                    }

                }


                
            //-----------------------------------case 4
                
            //0->橫放 1->(旋轉(zhuǎn)180)豎放
                for(i=0;i<4;i++){
                    
            for(j=0;j<4;j++){
                        
            if(i==j)continue;
                        
            for(k=0;k<16;k++){
                            tmp
            =k;cf=4;
                            W
            =0;H=0;
                            
            while(cf--){
            //                    printf("cf=%d\n",cf);
                                if(cf==i){
                                    
            if(tmp & 1){
                                        flaghh
            =w[i]; flagww=h[i];
                                    }

                                    
            else{
                                        flaghh
            =h[i]; flagww=w[i];
                                    }

                                }

                                
            else if(cf==j){
                                    
            if(tmp & 1){
                                        flagh
            =w[j]; flagw=h[j];
                                    }

                                    
            else{
                                        flagh
            =h[j]; flagw=w[j];
                                    }

                                }

                                
            else{
                                    
            if(tmp & 1){
                                        W
            +=h[cf]; H=max(H,w[cf]);
                                    }

                                    
            else{
                                        W
            +=w[cf]; H=max(H,h[cf]);
                                    }

            //                        printf("W=%d H=%d\n",W,H);
                                }

                                tmp
            /=2;
                            }

                            H
            =max(flaghh+flagh,H);
                            W
            =max(flagw,flagww)+W;
            //                printf("W=%d H=%d\n",W,H);
                            if(W>H)swap(W,H);
                            res[n].area
            =W*H;
                            res[n].w
            =W;
                            res[n
            ++].h=H;
                        }

                    }

                }


                
            //-----------------------------------case 5
                
            //0->橫放 1->(旋轉(zhuǎn)180)豎放            
                for(i=0;i<16;i++){
                    
            for(k=0;k<24;k++){
                        W
            =0;H=0;
                        tmp
            =i;cf=4;
                        
            for(j=0;j<4;j++){
                            flag[j]
            =i&(1<<(j));
                            
            if(flag[j]){
                                tw[dir[k][j]]
            =h[j];
                                th[dir[k][j]]
            =w[j];
                            }

                            
            else{
                                tw[dir[k][j]]
            =w[j];
                                th[dir[k][j]]
            =h[j];
                            }

                        }

                        
            if(th[2]>=th[1]+th[3]){
                            H
            =th[0]+th[2];
                            W
            =max(max(tw[0],tw[1]+tw[2]),tw[3]+tw[2]);
                        }

                        
            else if(th[2]>th[3&& th[2]<th[1]+th[3]){
                            H
            =max(th[0]+th[2],th[1]+th[3]);
                            W
            =max(max(tw[0]+tw[1],tw[1]+tw[2]),tw[2]+tw[3]);
                        }

                        
            else if(th[3]>th[2&& th[3]<th[0]+th[2]){
                            W
            =max(max(tw[0]+tw[1],tw[0]+tw[3]),tw[2]+tw[3]);
                            H
            =max(th[0]+th[2],th[1]+th[3]);
                        }

                        
            else if(th[3]>=th[0]+th[2]){
                            H
            =th[1]+th[3];
                            W
            =max(max(tw[1],tw[0]+tw[3]),tw[2]+tw[3]);
                        }

                        
            else if(th[2]==th[3]){
                            H
            =max(th[0]+th[2],th[1]+th[3]);
                            W
            =max(tw[0]+tw[1],tw[2]+tw[3]);
                        }

                
            //        printf("W=%d H=%d\n",W,H);
                        if(W>H)swap(W,H);
                        res[n].area
            =W*H;
                        res[n].w
            =W;
                        res[n
            ++].h=H;
                    }

                }

                sort(res,res
            +n,cmp);
                printf(
            "%d\n",res[0].area);
                printf(
            "%d %d\n",res[0].w,res[0].h);
                
            int pre=0;
            //    printf("\n\n");
                for(i=0;i<n;i++){
                    
            if(res[i].area==res[0].area && res[i].w!=res[pre].w){
                        pre
            =i;
                        printf(
            "%d %d\n",res[i].w,res[i].h);
                    }

            //        printf("%d %d %d\n",res[i].area,res[i].w,res[i].h);
                }

                
            return 0;
            }

            99久久99久久| 久久精品国产亚洲AV麻豆网站| 国产99久久久久久免费看| 久久九九全国免费| 亚洲国产成人久久精品99| 久久精品国产亚洲av日韩| 久久精品中文字幕有码| 精品久久亚洲中文无码| 亚洲成色www久久网站夜月| 51久久夜色精品国产| 思思久久精品在热线热| 亚洲国产精品人久久| 无码人妻精品一区二区三区久久久| 久久se精品一区二区| 亚洲va久久久噜噜噜久久狠狠 | 精品综合久久久久久98| 久久精品国产91久久麻豆自制| 美女久久久久久| www性久久久com| 久久午夜夜伦鲁鲁片免费无码影视 | 久久久久久人妻无码| 欧美成a人片免费看久久| 99国产精品久久| 亚洲午夜久久久影院伊人| 欧美精品福利视频一区二区三区久久久精品| 亚洲国产精品18久久久久久| 99久久香蕉国产线看观香| 久久久不卡国产精品一区二区| 国产一区二区精品久久| 亚洲色大成网站www久久九| 久久天天躁狠狠躁夜夜2020一| 欧美久久久久久精选9999| 久久国产精品免费一区| 国产日韩久久免费影院| 国产—久久香蕉国产线看观看| 亚洲一区中文字幕久久| 久久综合中文字幕| 人人狠狠综合久久亚洲婷婷| 国产精品熟女福利久久AV| 九九久久精品国产| 亚洲乱码日产精品a级毛片久久|