HDU 5128 The E-pang Palace 几何题 求两个不相交矩阵面积和

给出多个点,问你能否找到两个四条边都平行坐标轴的矩形

且这两个矩形不相交

所能找到输出对应的最大面积,否则输出imp

有个坑就是两个矩形可能会形成回字形: 就是嵌套的关系面积为最外面的面积

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define bug puts("************")
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
struct Point
{
    int x,y;
    friend bool operator <(Point p1,Point p2)
    {
        if(p1.x!=p2.x)
        return p1.x<p2.x;
        return p1.y<p2.y;
    }
}p[100];
struct Rec
{
    Point p1,p2;
    int area;
}rec[10000];
int Judge(int i,int j)
{
    if(rec[i].p1.x>rec[j].p2.x) return 1;
    if(rec[i].p1.y>rec[j].p2.y) return 1;
    if(rec[i].p2.x<rec[j].p1.x) return 1;
    if(rec[i].p2.y<rec[j].p1.y) return 1;
    if(rec[i].p1.x<rec[j].p1.x&&rec[i].p1.y<rec[j].p1.y
       &&rec[i].p2.x>rec[j].p2.x&&rec[i].p2.y>rec[j].p2.y)
        return 2;
    return 0;
}

bool ma[500][500];
int main()
{
    int n;
    while(~scanf("%d",&n),n)
    {
        memset(ma,0,sizeof(ma));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&p[i].x,&p[i].y);
            ma[p[i].x][p[i].y]=1;
        }
        sort(p,p+n);
        int num=0;
        for(int i=0;i<n;i++)   ///提取矩形(因为是排完序的所以p1的坐标的x或y小于等于p2的)
        {
            for(int j=i+1;j<n;j++)
            {
                    /// 满足矩形的条件四个条件不可漏 ,存在边,并且,点不重合或在一条线上
                if(ma[p[i].x][p[j].y]&&ma[p[j].x][p[i].y]&&p[j].x>p[i].x&&p[j].y>p[i].y)
                {
                    rec[num].area=(p[j].y-p[i].y)*(p[j].x-p[i].x);
                    rec[num].p1=p[i];
                    rec[num++].p2=p[j];
                }
            }
        }

        int ans=-1;
        for(int i=0;i<num;i++)
        {
            for(int j=i+1;j<num;j++)
            {
                int biao=Judge(i,j);
                if(biao==1)
                    ans=max(ans,rec[i].area+rec[j].area);
                else if(biao==2)
                    ans=max(max(ans,rec[i].area),rec[j].area);
            }
        }
        if(ans==-1)
            puts("imp");
        else
        printf("%d\n",ans);
    }

    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值