Packing Rectangles_专业打酱油_百度空间

一个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;
}


郑重声明:资讯 【Packing Rectangles_专业打酱油_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——