• pku2007 Scrambled Polygon


    http://poj.org/problem?id=2007

    计算几何,凸包,逆时针排序

      1 #include <stdio.h>
      2 #include <vector>
      3 #include <queue>
      4 #include <algorithm>
      5 #include <math.h>
      6 
      7 using namespace std;
      8 
      9 const double eps = 1e-8;
     10 
     11 int cmp(double x)
     12 {
     13     if(fabs(x) < eps) return 0;
     14     if(x > 0) return 1;
     15     return -1;
     16 }
     17 
     18 
     19 struct point
     20 {
     21     double x, y;
     22     point() {}
     23     point(double a, double b): x(a), y(b) {}
     24     friend point operator - (const point &a, const point &b)
     25     {
     26         return point(a.x-b.x, a.y-b.y);
     27     }
     28     friend bool operator == (const point &a, const point &b)
     29     {
     30         return cmp(a.x-b.x) ==0 && cmp(a.y-b.y) ==0;
     31     }
     32 };
     33 
     34 double det(const point &a, const point &b)
     35 {
     36     return a.x*b.y - a.y*b.x;
     37 }
     38 
     39 struct polygon_convex
     40 {
     41     vector<point> P;
     42     polygon_convex(int Size=0)   
     43     {
     44         P.resize(Size);
     45     }
     46 }polygon1;
     47 
     48 bool comp_less(const point &a, const point &b)
     49 {
     50     return cmp(a.x-b.x)<0 || cmp(a.x-b.x)==0 && cmp(a.y-b.y)<0;
     51 }
     52 
     53 polygon_convex convex_hull(vector<point> a)
     54 {
     55     polygon_convex res(2*a.size()+5);
     56     sort(a.begin(), a.end(), comp_less);
     57     a.erase(unique(a.begin(), a.end()), a.end());
     58     int m=0;
     59     for(int i=0; i<a.size(); ++i)
     60     {
     61         while(m>1 && cmp(det(res.P[m-1]-res.P[m-2], a[i]-res.P[m-2])) <= 0) --m;
     62         res.P[m++] = a[i];
     63     }
     64     int k = m;
     65     for(int i=int(a.size())-2; i>=0; --i)
     66     {
     67         while(m>k && cmp(det(res.P[m-1]-res.P[m-2], a[i]-res.P[m-2])) <= 0) --m;
     68         res.P[m++] = a[i];
     69     }
     70     res.P.resize(m);
     71     if(a.size()>1) res.P.resize(m-1);
     72     return res;
     73 }
     74 
     75 vector<point> v1, r1;
     76 
     77 int main()
     78 {
     79     double x, y;
     80     int i, flag;
     81     while(~scanf("%lf%lf", &x, &y))
     82     {
     83         point p(x, y);
     84         v1.push_back(p);
     85     }
     86     polygon1 = convex_hull(v1);
     87     r1 = polygon1.P;
     88     flag = 0;
     89     for(i=0; i<r1.size(); i++)
     90     {
     91         if(r1[i].x == 0.0 && r1[i].y == 0.0)
     92         {
     93             flag = 1;
     94         }
     95         if(flag)
     96         {
     97             printf("(%.0lf,%.0lf)\n", r1[i].x, r1[i].y);
     98         }
     99     }
    100     for(i=0; i<r1.size(); i++)
    101     {
    102         if(r1[i].x == 0.0 && r1[i].y == 0.0)
    103         {
    104             break;
    105         }
    106         printf("(%.0f,%.0f)\n", r1[i].x, r1[i].y);
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    我们在囧途之程序员转型记
    项目开发应遵循1+7还是7+1?
    自己用的一款模板解析程序(支持插件和扩展)(思路讨论和使用体验)
    设计的核心任务之一:层次的控制
    【设计 = 编码】 VS 【设计 ≠ 编码】
    从一生的角度看程序员的学习和发展
    编码质量与命名
    软件开发十年小史
    设计的核心任务之三:确保正交性
    国内外软件开发上的差距与分析
  • 原文地址:https://www.cnblogs.com/yuan1991/p/pku2007.html
Copyright © 2020-2023  润新知