USACO 1.4 Packing Rectangles

1 /*
2 ID: ******
3 PROG: packrec
4 LANG: C++
5  */
6 #include <iostream>
7 #include <fstream>
8 #include <algorithm>
9 #include <string>
10 #include <vector>
11 using namespace std;
12
13 #define maxN(x,y) ((x)>(y)?(x):(y))
14
15 struct rec
16 {
17 int wid;
18 int highet;
19 int squre;
20 rec(int w,int h)
21 {
22 if(w>h)
23 {
24 int temp =w ;
25 w = h;
26 h = temp;
27 }
28 highet = h;
29 wid = w;
30 squre = w* h;
31 }
32 rec(){}
33 void swap()
34 {
35 int temp = wid;
36 wid = highet;
37 highet = temp;
38 }
39 };
40 bool compare(const rec& r1,const rec& r2)
41 {
42 if(r1.squre!=r2.squre)
43 return r1.squre<r2.squre;
44 else
45 return r1.wid<r2.wid;
46 }
47 rec v[4];
48 vector<rec> res;
49 int have[4];
50 int main()
51 {
52 ofstream fout ("packrec.out");
53 ifstream fin ("packrec.in");
54
55 have[0] = 1;
56 have[1] = 1;
57 have[2] = 1;
58 have[3] = 1;
59 for(int i = 0 ; i!=4; ++i)
60 {
61 int tw,th;
62 fin>>tw>>th;
63 //if(tw>th)
64 //{
65 // int temp = tw;
66 // tw = th;
67 // th = temp;
68 //}
69 v[i].wid = tw;
70 v[i].highet = th;
71 }
72
73 for(int r1 = 0;r1!=4;++r1)
74 {
75 have[r1] = 0;
76 for(int r2 = 0;r2!=4;++r2)
77 {
78 if(!have[r2]) continue;
79 have[r2]=0;
80 for(int r3=0;r3!=4;++r3)
81 {
82 if(!have[r3]) continue;
83 have[r3] =0;
84 for(int r4=0;r4!=4;++r4)
85 {
86 if(!have[r4]) continue;
87 for(int r1s = 0;r1s!=2;++r1s,v[r1].swap())
88 for(int r2s = 0;r2s!=2;++r2s,v[r2].swap())
89 for(int r3s = 0;r3s!=2;++r3s,v[r3].swap())
90 for(int r4s = 0;r4s!=2;++r4s,v[r4].swap())
91 {
92 int w2;
93 int h2;
94 w2 = v[r1].wid + v[r2].wid + v[r3].wid + v[r4].wid;
95 h2 = maxN(maxN(maxN(v[r1].highet,v[r2].highet),v[r3].highet),v[r4].highet);
96 res.push_back(rec(w2,h2));
97
98 w2 = v[r2].wid+v[r3].wid+ v[r4].wid;
99 h2 = maxN(v[r2].highet,maxN(v[r3].highet,v[r4].highet));
100 h2+=v[r1].wid;
101 w2 = maxN(w2,v[r1].highet);
102 res.push_back(rec(w2,h2));
103
104 w2 = v[r1].wid + maxN(v[r2].highet,v[r3].wid+v[r4].wid);
105 h2 = maxN(v[r1].highet,v[r2].wid+maxN(v[r3].highet,v[r4].highet));
106 res.push_back(rec(w2,h2));
107
108 w2 = v[r1].wid+v[r2].wid+maxN(v[r3].wid,v[r4].wid);
109 h2 = maxN(v[r3].highet+v[r4].highet,maxN(v[r1].highet,v[r2].highet));
110 res.push_back(rec(w2,h2));
111
112 h2 = max(v[r1].highet+v[r3].highet,v[r2].highet+v[r4].highet);
113 if (v[r3].highet>=v[r2].highet+v[r4].highet)
114 w2=max(v[r1].wid,v[r3].wid+max(v[r2].wid,v[r4].wid));
115 if (v[r3].highet>v[r4].highet&&v[r3].highet<v[r2].highet+v[r4].highet)
116 w2=max(v[r1].wid+v[r2].wid,v[r3].wid+max(v[r2].wid,v[r4].wid));
117 if (v[r3].highet<v[r4].highet&&v[r4].highet<v[r1].highet+v[r3].highet)
118 w2=max(v[r1].wid+v[r2].wid,v[r4].wid+max(v[r1].wid,v[r3].wid));
119 if (v[r4].highet>=v[r1].highet+v[r3].highet)
120 w2=max(v[r2].wid,v[r4].wid+max(v[r1].wid,v[r3].wid));
121 if (v[r3].highet==v[r4].highet)
122 w2=max(v[r1].wid+v[r2].wid,v[r3].wid+v[r4].wid);
123
124 res.push_back(rec(w2,h2));
125 }
126 }
127 have[r3] =1;
128 }
129 have[r2]=1;
130 }
131
132 have[r1] = 1;
133 }
134
135 sort(res.begin(),res.end(),compare);
136
137 int minNum = res[0].squre;
138
139 int lastW=0;
140 fout<<minNum<<endl;
141 for(vector<rec>::iterator i = res.begin();
142 i!=res.end();++i)
143 {
144 if(i->squre!=minNum) break;
145 if(lastW == i->wid) continue;
146 lastW = i->wid;
147 fout<<i->wid<<" " <<i->highet<<endl;
148 }
149 fin.close();
150 fout.close();
151 return 0;
152 }
153
154
posted @ 2011-05-02 00:13  幻魇  阅读(285)  评论(0编辑  收藏  举报