【HDOJ】5128

暴力+计算几何。

  1 /* 5128 */
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <cstdlib>
  7 using namespace std;
  8 
  9 typedef struct point {
 10     int x, y;
 11     point) {}
 12     pointint xx, int yy) {
 13         x = xx; y = yy;
 14     }
 15     friend bool operator <const point &a, const point &b) {
 16         if a.x == b.x)
 17             return a.y < b.y;
 18         else
 19             return a.x < b.x;
 20     }
 21 } point;
 22 
 23 typedef struct {
 24     point v[4];
 25 } square_t ;
 26 
 27 #define MAXN 35
 28 
 29 int n, m;
 30 point p[MAXN];
 31 point sq[4];
 32 square_t q[10005];
 33 
 34 bool isSquare) {
 35     if sq[0].x!=sq[1].x || sq[0].y!=sq[2].y || sq[1].y!=sq[3].y || sq[2].x!=sq[3].x)
 36         return false;
 37     return sq[0].x!=sq[3].x && sq[0].y!=sq[3].y;
 38 }
 39 
 40 bool isTouchint i, int j) {
 41     for int u=0; u<4; ++u) {
 42         for int v=0; v<4; ++v) {
 43             if q[i].v[u].x==q[j].v[v].x && q[i].v[u].y==q[j].v[v].y)
 44                 return true;
 45         }
 46     }
 47     if q[i].v[0].x==q[j].v[0].x || q[i].v[2].x==q[j].v[0].x || q[i].v[0].x==q[j].v[2].x || q[i].v[2].x==q[j].v[2].x) && !q[j].v[0].y>q[i].v[3].y || q[i].v[0].y>q[j].v[3].y))
 48         return true;
 49     if q[i].v[0].y==q[j].v[0].y || q[i].v[2].y==q[j].v[0].y || q[i].v[0].y==q[j].v[2].y || q[i].v[2].y==q[j].v[2].y) && !q[j].v[0].x>q[i].v[3].x || q[i].v[0].x>q[j].v[3].x))
 50         return true;
 51     return false;
 52 }
 53 
 54 bool isCrossint i, int j) {
 55     return q[i].v[0].x<=q[j].v[0].x && q[i].v[0].y<=q[j].v[0].y && q[i].v[3].x>=q[j].v[0].x && q[i].v[3].x>=q[j].v[0].y && q[i].v[3].x<=q[j].v[3].x && q[i].v[3].y<=q[j].v[3].y;
 56 }
 57 
 58 bool isIncludedint i, int j) {
 59     return q[i].v[0].x<q[j].v[0].x && q[i].v[0].y<q[j].v[0].y && q[i].v[3].x>q[j].v[3].x && q[i].v[3].y>q[j].v[3].y;
 60 }
 61 
 62 int main) {
 63     int i, j, k, r;
 64     int ans;
 65     
 66     #ifndef ONLINE_JUDGE
 67         freopen"data.in", "r", stdin);
 68         freopen"data.out", "w", stdout);
 69     #endif
 70     
 71     while scanf"%d",&n)!=EOF && n) {
 72         for i=0; i<n; ++i)
 73             scanf"%d %d", &p[i].x, &p[i].y);
 74         if n < 8) {
 75             puts"imp");
 76             continue;
 77         }
 78         sortp, p+n);
 79         m = 0;
 80         for i=0; i<n; ++i) {
 81             for j=0; j<n; ++j) {
 82                 if i == j)
 83                     continue;
 84                 for k=0; k<n; ++k) {
 85                     if k==i || k==j)
 86                         continue;
 87                     for r=0; r<n; ++r) {
 88                         if r==i || r==j || r==k)
 89                             continue;
 90                         sq[0] = p[i];
 91                         sq[1] = p[j];
 92                         sq[2] = p[k];
 93                         sq[3] = p[r];
 94                         sortsq, sq+4);
 95                         if isSquare)) {
 96                             q[m].v[0] = sq[0];
 97                             q[m].v[1] = sq[1];
 98                             q[m].v[2] = sq[2];
 99                             q[m].v[3] = sq[3];
100                             ++m;
101                         }
102                     }
103                 }
104             }
105         }
106         ans = -1;
107         for i=0; i<m; ++i) {
108             for j=0; j<m; ++j) {
109                 if i == j)
110                     continue;
111                 if isTouchi, j) || isCrossj, i) || isCrossi, j))
112                     continue;
113                 if isIncludedi, j)) {
114                     k = q[i].v[3].x - q[i].v[0].x) * q[i].v[3].y - q[i].v[0].y);
115                 } else if isIncludedj, i)) {
116                     k = q[j].v[3].x - q[j].v[0].x) * q[j].v[3].y - q[j].v[0].y);
117                 } else {
118                     k = q[i].v[3].x - q[i].v[0].x) * q[i].v[3].y - q[i].v[0].y) +
119                         q[j].v[3].x - q[j].v[0].x) * q[j].v[3].y - q[j].v[0].y);
120                 }
121                 if k > ans)
122                     ans = k;
123             }
124         }
125         if ans < 0)
126             puts"imp");
127         else
128             printf"%d
", ans);
129     }
130     
131     return 0;
132 }

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注