HDU 5128 The E-pang Palace
2015-07-17 15:37
627 查看
题意:给定n个点,判断有没有不相交的矩形,输出矩形面积的并(坑点:嵌套则输出较大的矩形面积)。
嵌套特判一下,其余不相交则比较矩形重心差的两倍(避免出现小数)是否大于边长的和,x、y方向满足一个即可。
嵌套特判一下,其余不相交则比较矩形重心差的两倍(避免出现小数)是否大于边长的和,x、y方向满足一个即可。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<stdlib.h> #include<map> #include<set> #include<stack> #include<vector> #include<string> #include<algorithm> #define mod 1000000007 #define INF 1000000000 #define maxn 1000110 #define PI 3.1415926535897932 #define ll __int64 using namespace std; struct POINT { int x; int y; }p[220]; int n,have[220][220],vis[220][220]; int cmp(POINT a,POINT b) { return a.y < b.y; } int main() { int i,j,k,l,tmp,x[5],y[5],ans; while(scanf("%d",&n) && n) { memset(x,0,sizeof(x)); memset(y,0,sizeof(y)); memset(have,0,sizeof(have)); memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { scanf("%d %d",&p[i].x,&p[i].y); have[p[i].x][p[i].y] = i+1; //点是否存在且下标加一 } ans = -1; for(i = 0 ; i < n; i++) for(j = i+1 ; j < n; j++) { if(p[i].x == p[j].x || p[i].y == p[j].y) continue; x[1] = p[i].x ,x[2] = p[j].x , y[1] = p[i].y , y[2] = p[j].y ; if(x[1] > x[2]) swap(x[1],x[2]); if(y[1] > y[2]) swap(y[1],y[2]); if(have[x[1]][y[1]] && have[x[2]][y[2]] && have[x[1]][y[2]] && have[x[2]][y[1]]) { vis[x[1]][y[1]] = vis[x[2]][y[1]] = vis[x[1]][y[2]] = vis[x[2]][y[2]] = 1; for(k = 0;k < n;k++) for( l = k+1 ; l < n; l++) if(k != i && k != j && l != i && l != j ) { if(p[k].x == p[l].x || p[k].y == p[l].y) continue; x[3] = p[k].x ,x[4] = p[l].x , y[3] = p[k].y , y[4] = p[l].y ; if(!vis[x[3]][y[3]] && !vis[x[4]][y[4]] && !vis[x[3]][y[4]] && !vis[x[4]][y[3]] ) { if(have[x[3]][y[3]] && have[x[4]][y[4]] && have[x[3]][y[4]] && have[x[4]][y[3]]) { if(x[3] > x[4]) swap(x[3],x[4]); if(y[3] > y[4]) swap(y[3],y[4]); int zx,zy,hx,hy,f=0; zx = abs(x[1]+x[2] - x[3] -x[4]); zy = abs(y[1]+y[2] - y[3] -y[4]); hx = abs(x[1]-x[2]) + abs( x[3] -x[4]); hy = abs(y[1]-y[2]) + abs( y[3] -y[4]); if(zx > hx || zy > hy) f=1; else if(x[1] < x[3] && y[1] < y[3] && x[2] > x[4] && y[2] > y[4] ) f = 2; else if(x[1] > x[3] && y[1] > y[3] && x[2] < x[4] && y[2] < y[4]) f = 3 ; tmp = -1; if(f == 2) tmp = (x[2] - x[1] ) * (y[2] - y[1]); else if(f == 3) tmp = (x[4] - x[3] ) * (y[4] - y[3]); else if( f == 1 ) tmp = (x[2] - x[1] ) * (y[2] - y[1]) + (x[4] - x[3] ) * (y[4] - y[3]); if( tmp > ans ) ans = tmp; } } } vis[x[1]][y[1]] = vis[x[2]][y[1]] = vis[x[1]][y[2]] = vis[x[2]][y[2]] = 0; } } if(ans < 0) printf("imp\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- 【Google Code Jam 2009 round2 problem D】Watering Plants (两圆交点求法详解)
- 计算几何模板
- 计算几何小模板
- BZOJ2829信用卡凸包
- HDU 4922 Hello, Your Package! (计算几何+DP)(WA)
- poj 1514&zoj 1185 Metal Cutting(半平面交)
- UVA 10969 Sweet Dream(圆的相交)
- uva 11177 Fighting Against a Polygonal Monster(凸包与圆的面积交)
- POJ1279 && LA2512 Art Gallery(求多边形的核)
- poj 2540 && uva 10084 Hotter Colder(半平面交)
- 【计算几何】POJ 2318 & POJ 2398
- 【计算几何】POJ 2653
- 【计算几何】POJ 1113
- POJ 2318 TOYS(叉积+二分or暴力)
- POJ 2398 Toy Storage(叉积+二分)
- POJ 1228 Grandpa's Estate 计算凸包+判断点在线段上
- POJ 1873 The Fortified Forest 计算凸包
- POJ 2007 Scrambled Polygon 极角排序
- POJ 2074 Line of Sight 直线相交+线段覆盖
- POJ 1269 Intersecting Lines 判断直线相交