一个dfs问题(因为要找出所有解),比较麻烦的就是如何安置那些长方形 剩下没什么了。 #include <iostream> #include <fstream> #include <string> #include <vector> #include <iterator> #include <algorithm> using namespace std; typedef pair<int, int> rect_info; typedef rect_info result_info; typedef vector<rect_info> rect_collection; typedef vector<result_info> result_collection; rect_collection given_rect; bool rect_used[4] = {0}; int minimum_size(10000000); // Hope this is large enough result_collection results; int pack_rect(int method, rect_collection& selected_rect, result_info& result) { int size; int w(0), h(0); if (method == 0) { for (int i = 0; i != 4; ++i) { w += selected_rect[i].first; } for (int i = 0; i != 4; ++i) { h = max(selected_rect[i].second, h); } } else if (method == 1) { int w1(0), w2(selected_rect[3].first); for (int i = 0; i != 3; ++i) { w1 += selected_rect[i].first; } for (int i = 0; i != 3; ++i) { h = max(selected_rect[i].second, h); } w = max(w1, w2); h += selected_rect[3].second; } else if (method == 2) { int w1(selected_rect[3].first), w2(selected_rect[2].first + selected_rect[3].first), h1(0), h2(selected_rect[3].second); for (int i = 0; i != 2; ++i) { w1 += selected_rect[i].first; h1 = max(h1, selected_rect[i].second); } h1 += selected_rect[2].second; w = max(w1, w2); h = max(h1, h2); } else if (method == 3 || method == 4) { for (int i = 0; i != 2; ++i) { w += selected_rect[i].first; } for (int i = 0; i != 2; ++i) { h = max(h, selected_rect[i].second); } w += max(selected_rect[2].first, selected_rect[3].first); h = max(h, selected_rect[2].second + selected_rect[3].second); } else if (method == 5) { if (selected_rect[2].second < selected_rect[3].second) { h = max(selected_rect[0].second + selected_rect[2].second, selected_rect[1].second + selected_rect[3].second); } else { h = max(selected_rect[0].second, selected_rect[1].second) + selected_rect[2].second; } if (selected_rect[0].first < selected_rect[2].first) { w = max(selected_rect[0].first + selected_rect[1].first, selected_rect[2].first + selected_rect[3].first); } else { w = max(selected_rect[1].first, selected_rect[3].first) + selected_rect[0].first; } } if (w > h) { swap(w, h); } result.first = w; result.second = h; size = w * h; return size; } void dfs(rect_collection& selected_rect) { rect_info temp; if (selected_rect.size() != 4) { for (rect_collection::iterator iter = given_rect.begin(); iter != given_rect.end(); ++iter) { if (rect_used[iter - given_rect.begin()]) { continue; } temp = *iter; rect_used[iter - given_rect.begin()] = true; selected_rect.push_back(temp); dfs(selected_rect); selected_rect.pop_back(); swap(temp.first, temp.second); selected_rect.push_back(temp); dfs(selected_rect); selected_rect.pop_back(); rect_used[iter - given_rect.begin()] = false; } } else { for (int i = 0; i != 6; ++i) { result_info result; int size; size = pack_rect(i, selected_rect, result); cout << size << endl; if (size > minimum_size) { continue; } else if (size < minimum_size) { minimum_size = size; results.clear(); } if (find(results.begin(), results.end(), result) == results.end()) { results.push_back(result); } } } } int main() { ofstream fout ("packrec.out"); ifstream fin ("packrec.in"); rect_collection selected_rect; int i(4); rect_info temp; while (i--) { fin >> temp.first >> temp.second; given_rect.push_back(temp); } dfs(selected_rect); sort(results.begin(), results.end()); fout << minimum_size << endl; for (result_collection::iterator iter = results.begin(); iter != results.end(); ++iter) { fout << iter->first << " " << iter->second << endl; } return 0; } |