• Graham


    今天照着自己的理解写了Graham.

    自己写错了很多次,所以先前看到的可能错了。。

    View Code
     1 const int maxn = 105;
     2 struct Point
     3 {
     4     float x,y;
     5 }p[maxn],stack[maxn];
     6 
     7 double xmult(Point p1,Point p2,Point p0)        //cross product 
     8 {
     9     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
    10 }
    11 
    12 double dis(Point p1,Point p2)        //distance
    13 {
    14     return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
    15 }
    16 
    17 bool cmp(Point a,Point b)    //sort the element of the point besides p[0]
    18 {
    19     double has;
    20     has=xmult(a,b,p[0]);
    21     if(has>0)        // a is the right of the b
    22         return 1;
    23     else if((has==0)&& (dis(a,p[0])<dis(b,p[0])))        //sort by distance
    24         return 1;
    25     else
    26         return 0;        //a is the left of th b
    27 }
    28 
    29 void swap(int r,int s)      
    30 {
    31     Point temp;
    32     temp=p[r];
    33     p[r]=p[s];
    34     p[s]=temp;
    35 }
    36 
    37 //Graham
    38 int Graham(int n)
    39 {
    40     int i,top,k;
    41     Point ans;
    42     top=2;
    43     if(n<=3)        
    44     {
    45         for(i=0;i<n;i++)
    46             stack[i]=p[i];
    47         return n;
    48     }
    49     k=0;
    50     for(i=1;i<n;i++)        //find the left-under point
    51     if((p[i].y<p[k].y )|| ((p[i].y==p[k].y)&&(p[i].x<p[k].x)))
    52         k=i;
    53     ans=p[0];    p[0]=p[k];    p[k]=ans;        //set the left-under to the p[0]
    54     sort(p+1,p+n,cmp);    
    55     for(i=0;i<=top;i++)
    56         stack[i]=p[i];
    57     for(i=top+1;i<n;i++)
    58     {
    59         if((i+1<n)&&(xmult(p[i],p[i+1],p[0])==0))        //the point in a line
    60             continue;
    61         while(xmult(p[i],stack[top],stack[top-1])>=0)        //if the p[i] is the right of the stack[top]
    62                     top--;                                        //choose the p[i]
    63         stack[++top]=p[i];    
    64     }
    65     return ++top;
    66 }
  • 相关阅读:
    css自适应宽高等腰梯形
    控制台屏蔽某console的输出
    js定时器的时间最小值-setTimeout、setInterval
    03_数字的字面量
    程序员-表情包
    程序员-趣图集
    js不是从上到下执行的吗?
    CSS样式重置
    系统程序名命令表
    js手风琴图片切换实现原理及函数分析
  • 原文地址:https://www.cnblogs.com/yoru/p/2708914.html
Copyright © 2020-2023  润新知