您的位置:首页 > 其它

HDU 5128 The E-pang Palace

2015-07-17 15:37 627 查看
题意:给定n个点,判断有没有不相交的矩形,输出矩形面积的并(坑点:嵌套则输出较大的矩形面积)。

嵌套特判一下,其余不相交则比较矩形重心差的两倍(避免出现小数)是否大于边长的和,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算几何