C++按矩形2d最小面积装箱,箱子数据包含ID,长宽,箱子允许旋转 ,并且返回盒子的摆放位置,代码
时间: 2023-10-24 10:04:27 浏览: 69
以下是C++实现按矩形2d最小面积装箱的代码:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
struct Box {
int id;
int w, h;
int x, y; // 左下角坐标
bool rotated;
Box(int _id, int _w, int _h) {
id = _id;
w = _w;
h = _h;
rotated = false;
}
};
bool cmp(Box& a, Box& b) {
return a.w * a.h > b.w * b.h; // 按面积从大到小排序
}
struct Bin {
int w, h;
vector<Box> boxes;
Bin(int _w, int _h) {
w = _w;
h = _h;
}
bool can_fit(Box& box) {
if (box.rotated) {
swap(box.w, box.h);
}
return box.w <= w && box.h <= h;
}
void put_box(Box& box) {
if (box.rotated) {
swap(box.w, box.h);
}
box.x = w - box.w;
box.y = h - box.h;
for (auto& b : boxes) {
if (b.x + b.w > box.x && box.x + box.w > b.x && b.y + b.h > box.y && box.y + box.h > b.y) {
box.x = b.x - box.w;
}
}
boxes.push_back(box);
}
};
int main() {
int n, bin_w, bin_h;
cin >> n >> bin_w >> bin_h;
vector<Box> boxes;
for (int i = 1; i <= n; i++) {
int w, h;
cin >> w >> h;
boxes.push_back(Box(i, w, h));
boxes.push_back(Box(i, h, w));
}
sort(boxes.begin(), boxes.end(), cmp);
vector<Bin> bins;
for (auto& box : boxes) {
bool placed = false;
for (auto& bin : bins) {
if (bin.can_fit(box)) {
bin.put_box(box);
placed = true;
break;
}
}
if (!placed) {
Bin bin(bin_w, bin_h);
bin.put_box(box);
bins.push_back(bin);
}
}
for (auto& bin : bins) {
cout << "Bin " << &bin - &bins[0] + 1 << ": " << endl;
for (auto& box : bin.boxes) {
cout << "Box " << box.id << ": (" << box.x << ", " << box.y << ")" << endl;
}
cout << endl;
}
return 0;
}
```
首先,定义了一个 `Box` 结构体来表示箱子,其中包含了 ID、长宽、左下角坐标以及是否旋转的信息。
然后,定义了一个 `Bin` 结构体来表示一个箱子容器,其中包含了长宽和已经放置的箱子的信息。
接着,使用 `cmp` 函数将所有箱子按照面积从大到小排序。
在主函数中,根据输入的箱子信息和箱子容器的长宽,初始化了一个所有箱子的数组 `boxes`,然后将每个箱子的信息按照长宽和宽长分别加入到 `boxes` 中。
随后,对 `boxes` 进行排序,并依次将每个箱子放入箱子容器中。如果当前所有箱子容器都不能容纳该箱子,则新建一个箱子容器。
最后,输出每个箱子容器中已经放置的箱子的信息。
需要注意的是,在放置箱子时,为了保证左下角坐标最小,需要对已经放置的箱子进行扫描,找到最靠左下方的可行位置。如果箱子需要旋转,则需要先交换长和宽,然后再进行放置。
阅读全文