zoukankan      html  css  js  c++  java
  • Monotone Chain Convex Hull(单调链凸包)

     1 Monotone Chain Convex Hull(单调链凸包)算法伪代码:
     2 //输入:一个在平面上的点集P
     3 //点集 P 按 先x后y 的递增排序
     4 //m 表示共a[i=0...m]个点,ans为要求的点;
     5 struct P
     6 {
     7     int x,y;
     8     friend int operator < (P a, P b)
     9 {
    10     if((a.x<b.x) || (a.x==b.x && a.y<b.y))
    11         return 1;
    12     return 0;
    13 }
    14 }a[m+10],ans[m+10];
    15 //判断第三点在这个直线的左侧还是右侧
    16 //当judge(), 的返回值小于等于0,说明在右侧,我们一直要找在直线右侧的点
    17 double judge(P a, P b,P c) 
    18 {
    19   return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
    20 }
    21 //构建下凸包,从左跑到右,由下面通过
    22    int k1=0;
    23    for(int i=0; i<m; i++)//下凸包
    24    {
    25        while(k1>1 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
    26        {
    27             k1--;
    28        }
    29      ans[k1++]=a[i];
    30    }
    31 // 构建上凸包,从右到左,由上面通过
    32  int k2=k1;
    33     for(int i=m-1; i>=0; i--)//上凸包
    34    {
    35        while(k1>k2 && judge(ans[k1-2],ans[k1-1],a[i])<=0)
    36        {
    37             k1--;
    38        }
    39      ans[k1++]=a[i];
    40    }
    41    k1--;//减去起点,因为起点进去了两次;

     凸包题目:nyoj 78 圈水池 poj 1113 wall

  • 相关阅读:
    2019春第八周作业
    2019春第七周作业
    第六周作业
    币值转换
    打印沙漏
    秋季学期学习总结
    人生影响最大的三位老师
    自我介绍
    2018秋季学习总结
    自己
  • 原文地址:https://www.cnblogs.com/lovychen/p/3988698.html
Copyright © 2011-2022 走看看