用c++的栈实现凸包算法,代码尽可能简洁
时间: 2024-03-15 10:47:23 浏览: 69
好的,以下是使用 C++ 栈实现的凸包算法代码,尽可能简洁:
```cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
struct Point {
int x, y;
// 重载运算符,用于排序
bool operator < (const Point &a) const {
return x < a.x || (x == a.x && y < a.y);
}
} p[N], s[N]; // p 表示输入的点集,s 表示凸包上的点集
int n, top; // n 表示输入点集的大小,top 表示凸包上的点的个数
// 计算两个向量的叉积
int cross(Point a, Point b, Point c) {
return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
// Graham 扫描算法
void Graham() {
sort(p + 1, p + n + 1); // 按照 x 坐标排序
top = 0;
for (int i = 1; i <= n; i++) {
while (top >= 2 && cross(s[top - 1], s[top], p[i]) <= 0) {
top--;
}
s[++top] = p[i];
}
int k = top;
for (int i = n - 1; i >= 1; i--) {
while (top > k && cross(s[top - 1], s[top], p[i]) <= 0) {
top--;
}
s[++top] = p[i];
}
top--; // 去掉重复的点
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &p[i].x, &p[i].y);
}
Graham();
// 输出凸包上的点
for (int i = 1; i <= top; i++) {
printf("%d %d\n", s[i].x, s[i].y);
}
return 0;
}
```
以上就是使用 C++ 栈实现的凸包算法代码,希望能够帮助您。
阅读全文