要求:给出若干个点,从这些点中挑出顶点,找到两个不相交的矩阵,使两个矩阵和最大。相交的图片如下:
方法:暴力枚举,注意回字型。
1.发现回字型的矩形(一个大矩形里面套一个小矩形)是可以的,首先判断是否第二个矩形在第一个矩形内部(不包括边界),矩形面积是大矩形的面积。
2.图中的三个情况是第二个矩形至少有一个点在第一个矩形的内部(包括边界),矩形面积是两个矩形的面积之和。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,cnt,max1;
struct ab
{
int x,y;
};
ab cd[35];
struct ef
{
int x1,y1,x2,y2,x3,y3,x4,y4;
};
ef gh[100001];
void judge_add(int i,int j)
{
int k,p,q,flag1,flag2;
int x1,y1,x2,y2,x3,y3,x4,y4,minx,miny,maxx,maxy;
if(cd[i].x==cd[j].x||cd[i].y==cd[j].y) return;
minx=min(cd[i].x,cd[j].x);
miny=min(cd[i].y,cd[j].y);
maxx=max(cd[i].x,cd[j].x);
maxy=max(cd[i].y,cd[j].y);
flag1=0,flag2=0;
if(cd[i].x>cd[j].x&&cd[i].y>cd[j].y||cd[i].x<cd[j].x&&cd[i].y<cd[j].y)
{
for(k=0;k<n;k++)
{
if(cd[k].x==minx&&cd[k].y==maxy) flag1=1;
if(cd[k].x==maxx&&cd[k].y==miny) flag2=1;
}
}
else
{
for(k=0;k<n;k++)
{
if(cd[k].x==minx&&cd[k].y==miny) flag1=1;
if(cd[k].x==maxx&&cd[k].y==maxy) flag2=1;
}
}
if(flag1==0||flag2==0) return;
x1=minx,y1=miny;
x2=minx,y2=maxy;
x3=maxx,y3=maxy;
x4=maxx,y4=miny;
for(k<0;k<cnt;k++)
{
if(gh[k].x1==x1&&gh[k].y1==y1&&gh[k].x2==x2&&gh[k].y2==y2&&
gh[k].x3==x3&&gh[k].y3==y3&&gh[k].x4==x4&&gh[k].y4==y4)
return;
}
gh[cnt].x1=x1,gh[cnt].y1=y1,gh[cnt].x2=x2,gh[cnt].y2=y2,
gh[cnt].x3=x3,gh[cnt].y3=y3,gh[cnt].x4=x4,gh[cnt].y4=y4;
cnt++;
}
bool allin(int i,int j)
{
int k,p,q;
if(gh[i].x1<gh[j].x1&&gh[i].y1<gh[j].y1&&
gh[i].x3>gh[j].x3&&gh[i].y3>gh[j].y3)
return 1;
else return 0;
}
int cal(int i)
{
return (gh[i].x3-gh[i].x1)*(gh[i].y3-gh[i].y1);
}
bool judge(int i,int j)
{
int k,p,q;
if(gh[i].x1>=gh[j].x1&&gh[i].x1<=gh[j].x3&&
gh[i].y1>=gh[j].y1&&gh[i].y1<=gh[j].y3||
gh[i].x2>=gh[j].x1&&gh[i].x2<=gh[j].x3&&
gh[i].y2>=gh[j].y1&&gh[i].y2<=gh[j].y3||
gh[i].x3>=gh[j].x1&&gh[i].x3<=gh[j].x3&&
gh[i].y3>=gh[j].y1&&gh[i].y3<=gh[j].y3||
gh[i].x4>=gh[j].x1&&gh[i].x4<=gh[j].x3&&
gh[i].y4>=gh[j].y1&&gh[i].y4<=gh[j].y3)
return 1;
else return 0;
}
void cal()
{
int i,j,k;
max1=-1;
for(i=0;i<cnt;i++)
{
for(j=i+1;j<cnt;j++)
{
if(allin(i,j)||allin(j,i))
max1=max(max1,max(cal(i),cal(j)));
else if(judge(i,j)||judge(j,i))//i与j交或j与i交
continue;
else max1=max(max1,cal(i)+cal(j));
}
}
}
int main()
{
int i,j,k;
while(1)
{
scanf("%d",&n);
if(n==0) break;
for(i=0;i<n;i++)
scanf("%d%d",&cd[i].x,&cd[i].y);
cnt=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
judge_add(i,j);
cal();
if(max1==-1) printf("imp\n");
else printf("%d\n",max1);
}
}