【编程】平面点集构成三角形的最小(大)周长(面积)

* 持续更新中 *

题目

空间中有n个点(x,y),求其中三个点构成三角形的最小(大)周长(面积)。

测试用例

说明

n个点不存在重复现象
输入点的个数 3<= n < 2000,
接下来n行数据 -10000 <= x,y <= 10000
0结束测试数据

输入

7
1 0
2 0
0 2
2 3
0 1
3 0
0 3
3
3 4
2 6
3 7
4
-5 -5
-4 3
4 1
3 -2
0

输出

0.0 4.0
1.5 1.5
10.5 33.0

代码

暴力解题

时间复杂度 O(n^3)

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <iomanip>

using namespace std;

namespace my
{

struct Point
{
    int x = 0;
    int y = 0;

    Point()
    {}

    Point(int a, int b)
    {
        x = a;
        y = b;
    }

    inline double dis(const Point& p)
    {
        return (p.x - x) * (p.x - x) + (p.y - y) * (p.y - y);
    }

};

inline double area(const Point& p1, const Point& p2, const Point& p3)
{
    return abs((p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x)) * 0.5;
}

}

int main()
{

    my::Point pos[2000];

    freopen("data.txt", "r", stdin);
    while (1)
    {
        int n = 0;
        cin >> n;
        if (n == 0)
            break;

        for (size_t i = 0; i < n; i++)
        {
            cin >> pos[i].x >> pos[i].y;
        }

        double minVal = DBL_MAX;
        double maxVal = DBL_MIN;

        for (size_t i = 0; i < n; i++)
        {
            for (size_t j = i + 1; j < n; j++)
            {
                for (size_t k = j + 1; k < n; k++)
                {
                    double area = my::area(pos[i], pos[j], pos[k]);

                    if (area < minVal)
                        minVal = area;
                    if (area > maxVal)
                        maxVal = area;
                }
            }
        }

        cout 
            << fixed << setprecision(1) << minVal << " " 
            << fixed << setprecision(1) << maxVal << endl;
    }

    return 0;
}

参考

1. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点 http://blog.csdn.net/lytning/article/details/25370169
2. 求平面散点集的凸包 http://www.cnblogs.com/tangxin-blog/p/5135736.html
3. 凸包问题的五种解法 http://blog.csdn.net/bone_ace/article/details/46239187
4. 实用高效的计算三角形面积的算法 http://jingyan.baidu.com/article/a65957f49596ab24e67f9be7.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值