暴力+计算几何。
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 }