C++按矩形2d最小面积二叉树装箱,箱子数据double型,包含ID,长宽,箱子允许旋转 ,并且返回盒子的摆放位置,代码
时间: 2023-10-11 16:11:31 浏览: 73
二叉树的功能实现,用c++实现的。
下面是一个基于贪心算法的C++代码实现,用于按矩形2d最小面积二叉树装箱:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// 定义矩形结构体,包含ID、长和宽
struct Rect {
int id;
double w, h;
bool rotated; // 是否旋转
};
// 定义箱子结构体,包含ID、长和宽
struct Box {
int id;
double w, h;
double x, y; // 箱子的左下角坐标
};
// 计算矩形的面积
double area(Rect r) {
return r.w * r.h;
}
// 比较两个矩形的面积大小
bool cmp(Rect a, Rect b) {
return area(a) > area(b);
}
// 计算两个矩形的最小距离
double dist(Rect a, Rect b) {
double dist_x = (a.w + b.w) / 2.0;
double dist_y = (a.h + b.h) / 2.0;
return sqrt(dist_x * dist_x + dist_y * dist_y);
}
// 计算矩形的旋转后的长和宽
void rotate(Rect& r) {
swap(r.w, r.h);
r.rotated = !r.rotated;
}
// 计算矩形的旋转后的面积
double rotated_area(Rect r) {
if (r.rotated) {
return r.h * r.w;
} else {
return area(r);
}
}
// 递归函数,用于将矩形放入箱子中
void pack(vector<Rect>& rects, vector<Box>& boxes) {
// 如果没有矩形需要被装箱,则递归结束
if (rects.empty()) {
return;
}
// 排序矩形,按面积从大到小排序
sort(rects.begin(), rects.end(), cmp);
// 取出最大的矩形
Rect largest = rects[0];
rects.erase(rects.begin());
// 创建一个新的箱子
Box box = {boxes.size() + 1, largest.w, largest.h, 0.0, 0.0};
// 遍历已有的箱子,找到最优的位置放置矩形
double min_dist = numeric_limits<double>::max();
for (Box& b : boxes) {
// 如果箱子已经满了,则跳过
if (b.w == 0 || b.h == 0) {
continue;
}
// 计算矩形和箱子之间的距离
double d = dist(largest, {0, b.w, b.h, b.x, b.y});
// 如果距离小于当前最小距离,则更新最优位置
if (d < min_dist) {
min_dist = d;
box.x = b.x;
box.y = b.y;
// 如果矩形需要旋转,则在最优位置旋转矩形
if (largest.rotated) {
rotate(largest);
}
// 如果矩形的长度大于箱子的长度,则将箱子进行旋转
if (largest.w > b.w) {
swap(b.w, b.h);
}
}
}
// 将矩形放入最优位置的箱子中
boxes.push_back(box);
// 递归处理剩余的矩形
pack(rects, boxes);
}
int main() {
// 创建矩形列表
vector<Rect> rects = {
{1, 3.0, 2.0, false},
{2, 4.0, 1.0, false},
{3, 2.0, 3.0, false},
{4, 5.0, 4.0, false},
{5, 1.0, 6.0, false}
};
// 创建箱子列表
vector<Box> boxes;
// 装箱
pack(rects, boxes);
// 输出箱子列表
for (Box b : boxes) {
cout << "Box " << b.id << ": (" << b.x << ", " << b.y << ")\n";
}
return 0;
}
```
在上面的代码中,我们首先定义了矩形和箱子的结构体,并且实现了一些用于计算矩形面积、矩形旋转、矩形间距离等工具函数。然后,我们使用一个递归函数来将矩形放入箱子中。在递归函数中,我们将矩形按面积从大到小排序,然后遍历已有的箱子,找到最优的位置放置矩形,并将矩形放入箱子中。最后,我们输出箱子列表,其中包含每个箱子的左下角坐标。
阅读全文