【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     point(int 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 isTouch(int 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 isCross(int 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 isIncluded(int 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         sort(p, 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                         sort(sq, 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 (isTouch(i, j) || isCross(j, i) || isCross(i, j))
112                     continue;
113                 if (isIncluded(i, 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 (isIncluded(j, 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 }
原文地址:https://www.cnblogs.com/bombe1013/p/4316661.html