【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\n", ans); 129 } 130 131 return 0; 132 }