• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LyonLys
愿意在角落唱沙哑的歌 再大声也都是给你 请用心听 不要说话 Contact me via E-mail: lyon.lys@gmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

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

posted @ 2012-07-16 15:18  LyonLys  阅读(164)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3