zoukankan      html  css  js  c++  java
  • 格雷厄姆扫描法解凸壳问题

     1 #include<iostream>
     2 #include<vector>
     3 #include<algorithm>
     4 #include<math.h>
     5 using namespace std;
     6 
     7 struct point
     8 {
     9     double x;
    10     double y;
    11     double angle;
    12 };
    13 //判断点A,D是否在点B,C连线的两侧
    14 bool different(point A,point B,point C,point D)
    15 {
    16     double x1=A.x,x2=B.x,x3=C.x,x4=D.x;
    17     double y1=A.y,y2=B.y,y3=C.y,y4=D.y;
    18     if(x3==x2)
    19     {
    20         if((x1-x2)*(x4-x2)<0)
    21             return true;
    22         else 
    23             return false;
    24     }
    25     else
    26     {
    27         if((((x1-x2)*(y3-y2)+y2*(x3-x2))/(x3-x2))*(((x4-x2)*(y3-y2)+y2*(x3-x2))/(x3-x2))<0)
    28             return true;
    29         else return false;
    30     }    
    31 }
    32 double my_angle(point A,point B)
    33 {
    34     if(A.x==B.x && A.y==B.y)
    35         return 0;
    36     return acos((B.x-A.x)/(sqrt((B.y-A.y)*(B.y-A.y)+(B.x-A.x)*(B.x-A.x))));
    37 }
    38 bool ismin(point A,point B)
    39 {
    40     return A.y<B.y;
    41 }
    42 bool isAngle(point A,point B)
    43 {
    44     return A.angle<B.angle;
    45 }
    46 int main()
    47 {
    48     vector<point> num;
    49     int x,y;
    50     char c;
    51     while(cin>>x>>y)
    52     {
    53         point temp;
    54         temp.x=x;
    55         temp.y=y;
    56         temp.angle=0;
    57         num.push_back(temp);
    58         cin.get(c);
    59         if(c=='
    ')
    60             break;
    61     }
    62     sort(num.begin(),num.end(),ismin);
    63     point first=num[0];
    64     for(vector<point>::iterator iter=num.begin();iter!=num.end();iter++)
    65     {
    66         (*iter).angle=my_angle(first,*iter);
    67     }
    68     sort(num.begin(),num.end(),isAngle);
    69     vector<point> result;
    70     result.push_back(num[0]);
    71     result.push_back(num[1]);
    72     for(int i=2;i<num.size()-1;i++)
    73     {
    74         if(!different(num[i-2],num[i-1],num[i],num[i+1]))
    75             result.push_back(num[i]);
    76     }
    77     result.push_back(num[num.size()-1]);
    78     for(int p=0;p<result.size();p++)
    79     {
    80         cout<<result[p].x<<" "<<result[p].y<<endl;
    81     }
    82     system("pause");
    83     return 0;
    84 }
  • 相关阅读:
    linux 终端相关
    「CF10D」LCIS
    「SP1043」GSS1
    「NOI2009」二叉查找树
    「CF650E」Clockwork Bomb
    「UVA10559」Blocks
    「LuoguP3979」遥远的国度
    「SDOI2015」寻宝游戏
    「CF741D」Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
    「CF600E」Lomsat gelral
  • 原文地址:https://www.cnblogs.com/riden/p/4726103.html
Copyright © 2011-2022 走看看