C++按矩形2d最小面积装箱,箱子数据保护ID,double长宽,箱子允许旋转 ,并且返回盒子的摆放位置,代码
时间: 2023-10-14 18:04:15 浏览: 178
以下是一个简单的C++程序实现按矩形2D最小面积装箱的功能,包括箱子数据保护ID,双重长宽,允许旋转,并返回盒子的摆放位置。
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 定义矩形
struct Rect {
int id;
double width;
double height;
double area;
bool rotate;
double x, y, w, h;
};
// 比较函数,按照面积从大到小排序
bool cmp(Rect a, Rect b) {
return a.area > b.area;
}
// 矩形装箱函数
vector<Rect> pack(vector<Rect>& rects, double containerWidth, double containerHeight) {
vector<Rect> res;
double x = 0, y = 0, w = 0, h = 0;
for (int i = 0; i < rects.size(); ++i) {
// 尝试放置矩形
if (w + rects[i].width <= containerWidth && h + rects[i].height <= containerHeight) {
rects[i].x = x;
rects[i].y = y;
rects[i].w = rects[i].rotate ? rects[i].height : rects[i].width;
rects[i].h = rects[i].rotate ? rects[i].width : rects[i].height;
res.push_back(rects[i]);
x += rects[i].w;
w += rects[i].w;
h = max(h, rects[i].h);
} else if (w + rects[i].height <= containerWidth && h + rects[i].width <= containerHeight) {
rects[i].rotate = true;
rects[i].x = x;
rects[i].y = y;
rects[i].w = rects[i].rotate ? rects[i].height : rects[i].width;
rects[i].h = rects[i].rotate ? rects[i].width : rects[i].height;
res.push_back(rects[i]);
x += rects[i].w;
w += rects[i].w;
h = max(h, rects[i].h);
} else {
// 换行
x = 0;
w = 0;
y += h;
h = 0;
--i;
}
}
return res;
}
int main() {
// 初始化矩形
vector<Rect> rects{{1, 2, 3, 6, false, 0, 0, 0, 0},
{2, 3, 4, 12, false, 0, 0, 0, 0},
{3, 4, 5, 20, false, 0, 0, 0, 0},
{4, 5, 6, 30, false, 0, 0, 0, 0},
{5, 6, 7, 42, false, 0, 0, 0, 0},
{6, 7, 8, 56, false, 0, 0, 0, 0},
{7, 8, 9, 72, false, 0, 0, 0, 0},
{8, 9, 10, 90, false, 0, 0, 0, 0}};
// 按照面积从大到小排序
sort(rects.begin(), rects.end(), cmp);
// 装箱
vector<Rect> res = pack(rects, 20, 30);
// 输出结果
for (auto& r : res) {
cout << "id: " << r.id << ", (" << r.x << ", " << r.y << "), w: " << r.w << ", h: " << r.h << endl;
}
return 0;
}
```
该程序首先定义了一个矩形结构体`Rect`,其中包含矩形的ID、长、宽、面积、是否允许旋转以及矩形在容器中的坐标和长宽。然后定义了一个比较函数`cmp`,用于按照面积从大到小排序。接着定义了一个矩形装箱函数`pack`,该函数接受需要装箱的矩形集合、容器的长和宽,返回装箱后的矩形集合。
在装箱函数中,首先将矩形按照面积从大到小排序,然后遍历每个矩形,尝试将其放置在容器中。如果当前行还有足够的宽度容纳该矩形,则将其放置在当前行,否则换行将该矩形放置在下一行。如果该矩形允许旋转,并且将其旋转后可以放置在当前行,则将其旋转后放置在当前行。
最后,在主函数中初始化矩形,按照面积从大到小排序,调用装箱函数进行装箱,输出结果。
请注意,此代码仅提供参考。在实际应用中,可能需要进行更多的错误处理和优化。
阅读全文
相关推荐
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)