鱼C论坛

 找回密码
 立即注册
查看: 3250|回复: 2

[已解决]凸包算法(convex hull)

[复制链接]
发表于 2021-11-9 17:09:13 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想问如要找很多组的凸包该如何实现, 用C++。谢谢。
例子:
输入
2(要找多少个)
5(第一个有5个坐标)
1 1
1 -1
0  0
-1 -1
-1 1
8(第二个有8个坐标)
1  0
0  1
0  -1
-1  0
2  0
0  2
0  -2
-2  0
输出
4(第一凸包由4个组成)
-1 -1
1 -1
1 1
-1 1
4(第二个凸包由4个组成)
-2  0
0  -2
0  2
2  0
最佳答案
2021-11-12 22:08:10
题解:
#include <bits/stdc++.h>

struct Point{int x, y;};

int orientation(Point p, Point q, Point r)
{
        int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
        if (val == 0) return 0;
        return (val > 0)? 1: 2;
}


void convexHull(Point points[], int n)
{
        if (n < 3) return;
        std::vector<Point> hull;
        int l = 0;
        for (size_t i = 1; i < n; i++) if (points[i].x < points[l].x) l = i;
        int p = l, q;
        do
        {
            hull.push_back(points[p]);
                q = (p+1)%n;
                for (size_t i = 0; i < n; i++) if (orientation(points[p], points[i], points[q]) == 2) q = i;
                p = q;

        } while (p != l);
        std::cout << "\nConvex Hull: " << hull.size() << "points" << std::endl;
        for (size_t i = 0; i < hull.size(); i++) std::cout << hull[i].x << ' ' << hull[i].y << std::endl;
        std::cout << std::endl;
}


int main()
{
        int N, T;
        std::cin >> T;
        for(size_t t = 0; t < T; t++){
            std::cin >> N;
            Point points[N];
            for(size_t i = 0; i < N; i++){
                int x, y;
                std::cin >> x >> y;
                points[i].x = x;
                points[i].y = y;
            }
            int n = sizeof(points)/sizeof(points[0]);
            convexHull(points, n);
        }
        
        return 0;
}
输入/输出:
2
5
1 1
1 -1
0  0
-1 -1
-1 1

Convex Hull: 4points
-1 -1
1 -1
1 1
-1 1

8
1  0
0  1
0  -1
-1  0
2  0
0  2
0  -2
-2  0

Convex Hull: 4points
-2 0
0 -2
2 0
0 2
我知道可以用 using namespace std,但是我比较喜欢不用命名空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-12 22:08:10 | 显示全部楼层    本楼为最佳答案   
题解:
#include <bits/stdc++.h>

struct Point{int x, y;};

int orientation(Point p, Point q, Point r)
{
        int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
        if (val == 0) return 0;
        return (val > 0)? 1: 2;
}


void convexHull(Point points[], int n)
{
        if (n < 3) return;
        std::vector<Point> hull;
        int l = 0;
        for (size_t i = 1; i < n; i++) if (points[i].x < points[l].x) l = i;
        int p = l, q;
        do
        {
            hull.push_back(points[p]);
                q = (p+1)%n;
                for (size_t i = 0; i < n; i++) if (orientation(points[p], points[i], points[q]) == 2) q = i;
                p = q;

        } while (p != l);
        std::cout << "\nConvex Hull: " << hull.size() << "points" << std::endl;
        for (size_t i = 0; i < hull.size(); i++) std::cout << hull[i].x << ' ' << hull[i].y << std::endl;
        std::cout << std::endl;
}


int main()
{
        int N, T;
        std::cin >> T;
        for(size_t t = 0; t < T; t++){
            std::cin >> N;
            Point points[N];
            for(size_t i = 0; i < N; i++){
                int x, y;
                std::cin >> x >> y;
                points[i].x = x;
                points[i].y = y;
            }
            int n = sizeof(points)/sizeof(points[0]);
            convexHull(points, n);
        }
        
        return 0;
}
输入/输出:
2
5
1 1
1 -1
0  0
-1 -1
-1 1

Convex Hull: 4points
-1 -1
1 -1
1 1
-1 1

8
1  0
0  1
0  -1
-1  0
2  0
0  2
0  -2
-2  0

Convex Hull: 4points
-2 0
0 -2
2 0
0 2
我知道可以用 using namespace std,但是我比较喜欢不用命名空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-12 22:18:38 | 显示全部楼层
兄弟,如果解答对你有帮助,请给最佳解答,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表