C++按矩形2d最小面积装箱,箱子数据为double数据,箱子允许旋转 ,代码
时间: 2023-11-06 18:08:25 浏览: 98
下面是一个C++的实现,采用了贪心算法来求解:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
struct Rect {
double w, h;
bool rotated;
};
struct Box {
double w, h;
};
bool cmp(Rect r1, Rect r2) {
return max(r1.w, r1.h) > max(r2.w, r2.h);
}
bool fit(Rect r, Box b) {
if (r.w <= b.w && r.h <= b.h) return true;
if (r.h <= b.w && r.w <= b.h) {
swap(b.w, b.h);
r.rotated = true;
return true;
}
return false;
}
double pack(vector<Rect>& rects, Box b) {
sort(rects.begin(), rects.end(), cmp);
double used_width = 0, used_height = 0;
for (auto& r : rects) {
if (fit(r, b)) {
if (used_width + r.w <= b.w) {
used_width += r.w;
used_height = max(used_height, r.h);
} else {
used_width = r.w;
used_height += r.h;
}
} else {
return -1; // 没有合适的箱子可以装下所有矩形
}
}
return used_width * used_height;
}
int main() {
vector<Rect> rects = {{3, 4}, {5, 2}, {1, 6}, {4, 3}};
Box box = {10, 10};
double area = pack(rects, box);
if (area == -1) {
cout << "没有合适的箱子可以装下所有矩形" << endl;
} else {
cout << "最小面积为:" << area << endl;
}
return 0;
}
```
该代码首先定义了 `Rect` 和 `Box` 两个结构体,分别表示矩形和箱子。`Rect` 包括矩形的宽度和高度,还有一个布尔变量 `rotated` 表示矩形是否旋转。`Box` 则只包括箱子的宽度和高度。
在 `cmp` 函数中,我们定义了矩形的比较方式。我们将矩形按照长边排序,这样可以尽可能地利用箱子的宽度。
在 `fit` 函数中,我们判断一个矩形是否能够放入一个箱子中。如果矩形的宽度和高度都小于等于箱子的宽度和高度,则可以直接放入;如果矩形的高度小于等于箱子的宽度,但是宽度大于箱子的高度,我们可以将矩形旋转90度并交换宽度和高度。如果都不满足,说明该矩形无法放入该箱子中。
在 `pack` 函数中,我们按照矩形的比较方式进行排序,然后从大到小依次尝试将矩形放入箱子中。如果能够放入,则更新箱子的使用情况。具体来说,我们维护两个变量 `used_width` 和 `used_height` 分别表示已经使用的宽度和高度。如果当前矩形可以放在当前行,则直接放入该行并更新 `used_width`,否则需要新起一行,将矩形放在新行的开头并更新 `used_height`。如果有一个矩形无法放入箱子中,则说明没有合适的箱子可以装下所有矩形,返回 `-1`。
在主函数中,我们定义了一些矩形和一个箱子,并调用 `pack` 函数来计算最小面积。如果返回的值为 `-1`,则说明没有合适的箱子可以装下所有矩形;否则输出最小面积。
阅读全文
相关推荐
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)