• poj 1228 凸包第一题


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

      看完凸包,第一次写凸包的题,搞了一晚终于AC了。

      这篇博客只是记录一下代码...

    View Code
      1 //#include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cstring>
      5 #include <cmath>
      6 #include <cctype>
      7 #include <vector>
      8 #include <set>
      9 #include <map>
     10 #include <string>
     11 #include <algorithm>
     12 #include <stack>
     13 #include <queue>
     14 
     15 #define INF 0x7fffffff
     16 #define reset(a) memset(a, 0, sizeof(a))
     17 #define copy(a, b) memcpy(a, b, sizeof(b))
     18 #define FMAX (1E300)
     19 #define MAX 1000000000
     20 #define feq(a, b) (fabs((a)-(b))<1E-6)
     21 #define flq(a, b) ((a)<(b)||feq(a, b))
     22 #define BASE 137
     23 #define PASS puts("pass")
     24 #define filein freopen("training_test.in", "r", stdin)
     25 #define fileout freopen("training_test.out", "w", stdout)
     26 #define eps 1e-8
     27 #define max2(a, b) ((a) > (b) ? (a) : (b))
     28 #define min2(a, b) ((a) < (b) ? (a) : (b))
     29 #define MAXN 1000001
     30 //#define __int64 long long
     31 //#define I64d lld
     32 
     33 #define debug 0
     34 
     35 using namespace std;
     36 
     37 struct point{
     38     double x;
     39     double y;
     40     bool operator < (const point &a) const{
     41         if (!feq(x, a.x)) return x < a.x;
     42         return y < a.y;
     43     }
     44     bool operator == (const point &a) const{
     45         return feq(x, a.x) && feq(y, a.y);
     46     }
     47     point operator - (point &a) const{
     48         point tmp;
     49         tmp.x = x - a.x;
     50         tmp.y = y - a.y;
     51         return tmp;
     52     }
     53 }p[1001], s[1001];
     54 point mp;
     55 int top;
     56 
     57 double dis(point a, point b){
     58     return abs(a.x - b.x) + abs(a.y - b.y);
     59 }
     60 
     61 double det(point a, point b){
     62     return a.x * b.y - b.x * a.y;
     63 }
     64 
     65 int cross(point a, point b, point c){
     66     double tmp = det(a - b, b - c);
     67     #if debug
     68     printf("tmp  %.5f\n", tmp);
     69     #endif
     70     return fabs(tmp) > eps ? (tmp > 0 ? 1 : -1) : 0;
     71 }
     72 
     73 bool cmp(point a, point b){
     74     double tmp = cross(mp, a, b);
     75     return fabs(tmp) > eps ? (tmp > 0) : (dis(mp, a) < dis(mp,b));
     76 }
     77 
     78 int main(){
     79     int T, n;
     80 
     81     scanf("%d", &T);
     82     while (T--){
     83         mp = {FMAX, FMAX};
     84         scanf("%d", &n);
     85         for (int i = 0; i < n; i++){
     86             scanf("%lf%lf", &p[i].x, &p[i].y);
     87             mp = min(mp, p[i]);
     88         }
     89         #if debug
     90         printf("mp %.5f %.5f\n", mp.x, mp.y);
     91         #endif
     92         if (n <= 5){
     93             printf("NO\n");
     94             continue;
     95         }
     96         sort(p, p + n, cmp);
     97         #if debug
     98         for (int i = 0; i < n; i++){
     99             printf("%.5f  %.5f\n", p[i].x, p[i].y);
    100         }
    101         for (int i = 0; i < n - 2; i++){
    102             printf("%d: %d\n", i, cross(p[i], p[i + 1], p[i + 2]));
    103         }
    104         #endif
    105 
    106         int t = n;
    107         while (t--){
    108             if (cross(mp, p[t], p[t - 1])){
    109                 break;
    110             }
    111         }
    112         for (int i = t; i <= (t + n - 1) / 2; i++){
    113             point tt;
    114 
    115             tt = p[i];
    116             p[i] = p[n - 1 - (i - t)];
    117             p[n - 1 - (i - t)] = tt;
    118         }
    119         #if debug
    120         for (int i = 0; i < n; i++){
    121             printf("%.5f  %.5f\n", p[i].x, p[i].y);
    122         }
    123         for (int i = 0; i < n - 2; i++){
    124             printf("%d: %d\n", i, cross(p[i], p[i + 1], p[i + 2]));
    125         }
    126         #endif
    127 
    128         bool ans = true, last = true;
    129         for (int i = 0; i <= n + 2; i++){
    130             int tmp = cross(p[i % n], p[(i + 1) % n], p[(i + 2) % n]);
    131             if (!tmp){
    132                 #if debug
    133                 printf("i %d\n", i);
    134                 #endif
    135                 last = true;
    136             }
    137             else{
    138                 if (!last){
    139                     ans = false;
    140                     #if debug
    141                     printf("tmp %d\n%.2f  %.2f  %.2f\n%.2f  %.2f  %.2f\n", tmp, p[i % n].x, p[(i + 1) % n].x, p[(i + 2) % n].x, p[i % n].y, p[(i + 1) % n].y, p[(i + 2) % n].y);
    142                     printf("false ans %d\n", i);
    143                     #endif
    144                     break;
    145                 }
    146                 last = false;
    147             }
    148         }
    149         if (ans)
    150             printf("YES\n");
    151         else
    152             printf("NO\n");
    153     }
    154 
    155     return 0;
    156 }

    ——written by Lyon

  • 相关阅读:
    Oracle分析函数
    oracle row_number的使用
    lru缓存测试类
    注解测试类
    lucene测试类
    SVN中检出(check out) 跟导出(export) 的区别
    Lucene原理与代码分析
    Lucene入门基础教程
    linux的less命令
    day4 大纲笔记
  • 原文地址:https://www.cnblogs.com/LyonLys/p/poj_1228_Lyon.html
Copyright © 2020-2023  润新知