HDU 5128 The E-pang Palace

题意:给定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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值