POJ 2160 - Box
http://poj.org/problem?id=2160
概要
与えられた6つの長方形から直方体が作れるかどうかを答える.
制約
- 各長方形の幅 w, 高さ h は 1 <= w, h <= 10000
解法
やるだけ.
まずちゃんとペアが作れるかどうか確認し,縦横を入れ替えつつ全組み方を試した.
poj/2160.cc1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 bool ok(const pair<int,int> *rects) 6 { 7 if (rects[0] != rects[1]) { 8 return false; 9 } 10 if (rects[2] != rects[3]) { 11 return false; 12 } 13 if (rects[4] != rects[5]) { 14 return false; 15 } 16 17 for (int s = 0; s < (1<<3); s++) { 18 pair<int,int> r[3]; 19 for (int i = 0; i < 3; i++) { 20 r[i] = rects[2*i]; 21 if (s & (1<<i)) { 22 swap(r[i].first, r[i].second); 23 } 24 } 25 sort(r, r+3); 26 do { 27 if (r[0].first == r[1].first 28 && r[1].second == r[2].second 29 && r[2].first == r[0].second) { 30 return true; 31 } 32 } while (next_permutation(r, r+3)); 33 } 34 return false; 35 } 36 37 int main() 38 { 39 pair<int,int> rects[6]; 40 for (int i = 0; i < 6; i++) { 41 int w, h; 42 cin >> w >> h; 43 if (w > h) { 44 swap(w, h); 45 } 46 // w <= h 47 rects[i].first = w; 48 rects[i].second = h; 49 } 50 sort(rects, rects+6); 51 cout << (ok(rects) ? "POSSIBLE" : "IMPOSSIBLE") << endl; 52 return 0; 53 }