平面上有n个点 如何寻找距离最远的两个点

一、问题描述

平面上有n个点,如何寻找距离最远的两个点?

二、解题思路

第一步,寻找凸包(因为最远距离的两个点一定在凸包上)

第二步,用旋转卡(qia)壳 寻找距离最大的点

凸包和旋转卡壳算法参见http://blog.csdn.net/kaytowin/article/details/5140111

三、代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<stack>
#define INF 100000000
using namespace std;

struct point{
    int x;
    int y;
    point(int x1,int y1):x(x1),y(y1){}
    point(){}
};
struct maxLS{
    point p1;
    point p2;
    int dist;
    maxLS(point pp1,point pp2,int dist1):p1(pp1),p2(pp2),dist(dist1){}
    maxLS(){}
};
int xmult(point p1,point p2,point p0){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
point p0(INF,INF);
vector<point> points;
vector<point> pstack;
void sort(vector<point>& points1){
    for(int j=points.size()-1;j>=1;j--){
        for(int i=1;i<j;i++){
            int xm=xmult(points[i],points[i+1],p0);

            if(xm<0){
                point tmp=points[i];
                points[i]=points[i+1];
                points[i+1]=tmp;
            }
        }
    }
}
//更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
void printPoints(vector<point> ps){
    for(int i=0;i<ps.size();i++){
        cout<<"<"<<ps[i].x<<","<<ps[i].y<<">"<<endl;
    }
}
void convexHull(){
    cout<<"打印输入点集:"<<endl;
    printPoints(points);
    sort(points);
    cout<<"打印按极角排序的点集:"<<endl;
    printPoints(points);
    pstack.push_back(points[0]);
    pstack.push_back(points[1]);
    int stack_top=pstack.size()-1;
    for(int i=2;i<points.size();i++){
        stack_top=pstack.size()-1;
        point pt2=pstack[stack_top];
        point pt1=pstack[stack_top-1];
        point ptcur=points[i];
        int xm=(pt2.x-pt1.x)*(ptcur.y-pt2.y)-(ptcur.x-pt2.x)*(pt2.y-pt1.y);
        while(xm<0){

            pstack.pop_back();
            stack_top=pstack.size()-1;
            pt2=pstack[stack_top];
            pt1=pstack[stack_top-1];
            xm=(pt2.x-pt1.x)*(ptcur.y-pt2.y)-(ptcur.x-pt2.x)*(pt2.y-pt1.y);

        }
        pstack.push_back(points[i]);
    }
    cout<<"打印凸包点集:"<<endl;
    printPoints(pstack);
}
int dist(point p1,point p2){
    return (p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y);
}
maxLS rotatingCalipers(){
    int q=1;
    int maxLength=0;
    maxLS mls;
    for(int i=0;i<pstack.size()-1;i++){
        while(xmult(pstack[i+1],pstack[(q+1)%pstack.size()],pstack[i])>xmult(pstack[i+1],pstack[q],pstack[i])){
            q=(q+1)%pstack.size();
        }
        int d1=dist(pstack[i],pstack[q]);
        int d2=dist(pstack[i+1],pstack[q]);
        if(d1>d2){
            maxLength=d1;
            mls=maxLS(pstack[i],pstack[q],d1);

        }else{
            maxLength=d2;
            mls=maxLS(pstack[i+1],pstack[q],d2);
        }

    }
    return mls;
}
int main(){
    cout<<"请输入节点数:"<<endl;
    int n;
    cin>>n;
    cout<<"请输入"<<n<<"个节点:"<<endl;
    int p0i=0;
    int t=0;
    while(n--){
        int x;
        int y;
        cin>>x>>y;
        if(y<p0.y||(y==p0.y&&x<p0.x)){
            p0.x=x;
            p0.y=y;
            p0i=t;

        }
        t++;
        points.push_back(point(x,y));
    }
    point tmp=points[0];
    points[0]=points[p0i];
    points[p0i]=tmp;

    convexHull();
    maxLS maxL= rotatingCalipers();
    cout<<"两点最大距离:"<<maxL.dist<<endl;
    cout<<"两点分别是:"<<"<"<<maxL.p1.x<<","<<maxL.p1.y<<">,";
    cout<<"<"<<maxL.p2.x<<","<<maxL.p2.y<<">"<<endl;
    system("pause");
    return 0;
}

四、输入:

9

3 1
4 3
5 2
3 5
6 5
8 4
5 7
2 6
1 4

五、输出:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 寻找源代码
, include
, 凸包问题
, vector
, 距离最远
, 凸包
, point
, 两个
, 三维凸包
, 寻找平面上的极大点
, n个点
寻找代码
海平面目测最远距离、寻找最远点对、excel 寻找最远的日期、wifi最远传输距离、7.1最远距离宏,以便于您获取更多的相关知识。

时间: 2024-09-20 00:42:14

平面上有n个点 如何寻找距离最远的两个点的相关文章

直方图-如何用动态规划解决平面上的n个点用k个矩形覆盖的最小面积?

问题描述 如何用动态规划解决平面上的n个点用k个矩形覆盖的最小面积? 假设有n个点,我们要用k个矩形去覆盖所用的点,然后这k个矩形的面积要尽可能小 1)矩形的底是在x轴上的(其实就是直方图) 2)矩形的面积可以为0(就是一条与x轴垂直的线) 3)矩形不能重叠(边线与顶点也都不能重合) 有人可以帮我一下吗?想了半天都没想出来怎么用动态规划解决这个问题 解决方案 将 n 个点的坐标排序(x 为主键) 任取一点将 n 个点分成 2 组 n1 和 n2,求出 2 个面积 m1 和 m2 从 n1 中取出

Hackbuteer1的专栏Stay Hungry,Stay Foolish!

转自:http://blog.csdn.net/Hackbuteer1/rss/list [原]九度互动社区IT名企招聘上机考试热身赛 http://ac.jobdu.com/problem.php?id=1326     Waiting in Line   //简单模拟题 #include<iostream> #include<cstdio> using namespace std; #include<memory.h> int pt[1001],leave[1001

Andrew Ng机器学习公开课笔记–Principal Components Analysis (PCA)

网易公开课,第14, 15课  notes,10 之前谈到的factor analysis,用EM算法找到潜在的因子变量,以达到降维的目的 这里介绍的是另外一种降维的方法,Principal Components Analysis (PCA), 比Factor Analysis更为直接,计算也简单些 参考,A Tutorial on Principal Component Analysis, Jonathon Shlens   主成分分析基于, 在现实中,对于高维的数据,其中有很多维都是扰动噪音

多普达手机之父杨兴平闯荡“自然道”

10多年前,杨兴平的团队开发出第一代智能手机系统,形成的产品成就了我们现在熟悉的苹果IPOD. 他对技术的迷恋令人吃惊,将改变人类的生活方式作为自己创业的宗旨,虽然屡遭挫折,却仍然坚持"为未来流血铺路". 李东生.田溯宁参股的"自然道"寄托了杨兴平的4C梦想,他想做下一个苹果或黑莓. 采访当天,理财周报记者比约定的时间早到了几分种,年轻的助理轻敲三次门,里面没有动静.推开门,发现杨兴平已经坐在椅子上睡着了."Charles真的太累了,他简直是空中飞人&qu

寻找平面上的极大点-我的这个程序那个地方出问题了,网上提交上去总是错误,跪求大神指点,谢谢

问题描述 我的这个程序那个地方出问题了,网上提交上去总是错误,跪求大神指点,谢谢 描述 在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b; 用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内. 给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点. 编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标. 本题规定:n不超过100,并且不考虑点的坐标为负数的情况. 输入 输入包

启明创投甘剑平:投资从来就不是一件浪漫的事

中介交易 SEO诊断 淘宝客 云主机 技术大厅 甘剑平 (新浪科技配图) 理财周报记者 张慧宇/文 凡是见过甘剑平的人,对他的最大印象莫过于留着两撇小胡子,外表酷似汪涵. 甘剑平从事PE投资近12年,可以说,他是国内第一批从事PE的人士之一. 2000年,还在凯雷任职的甘剑平负责投资了携程网,2003年携程网上市,并成为当年整个美国最好的单日IPO交易,甘剑平也由此声名大噪. 现在,作为启明创投的主管合伙人,甘剑平主要负责互联网和消费行业的投资. 启明创投成立于2006年,六年时间里,这家公司共

徐小平王强解读新东方:畅谈创业投资论

每经记者 李卓 实习生 白云鹤发自北京 3月20日晚,由搜狐财经和北京大学BiMBA联合主办.<每日经济新闻>担任联合主办媒体的未来大讲堂--"创业和投资"在北京大学与大学生和创业者见面,围绕 "创业与理想"这一主题,真格基金创始人.新东方创始人徐小平和真格基金合伙人.新东方创始人王强分别就上述问题进行了精彩演讲和阐述. 新东方的"创业经" "新东方最早的办公室只有八平方米."王强记忆说.十年之后,新东方成为首家在

Linux平台下DB2 UDB V8.1的安装与卸载

在Linux平台下DB2 UDB V8.1提供了命令行和图形界面两种安装方式,图形界面虽然通过交互简化了安装的复杂性,但安装过程需要人工干预,耗时相对较长,并且在内核较新的Linux版本下还存在无法启动GUI安装界面的问题,虽然可以通过设置环境变量进行解决,还是显得有些麻烦. 当然如果你用命令行方式手动安装就不存在这个问题,不过需要手动完成很多步骤,如果安装或卸载比较频繁的情况下,就不如把整个安装过程写入shell脚本执行方便. 下面是我完成的一个用于安装和卸载的shell脚本,在数据库安装时,

动漫文化刘会平布局“四大产业链”

对于巴比馒头来说,时间是真正的金钱.2011年总营业额达7亿元:2012年将超过10亿元.其60%以上的创收集中在早上九点至十点早餐的黄金时段,巴比馒头每分钟至少进账27000多元. 巴比馒头董事长刘会平对公司有着长远的规划.对于巴比的未来,5年内达到30亿元的营业额不是重点.上市不是重点.进军珠三角环渤海也不是重点--成为世界著名的中式面点制造中心.成就中式快餐国际著名品牌,才是这只"小馒头"为之奋斗的大目标. 两条腿走路 从http://www.aliyun.com/zixun/a