给出多个点,问你能否找到两个四条边都平行坐标轴的矩形
且这两个矩形不相交
所能找到输出对应的最大面积,否则输出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;
}