题意:枚举矩形,注意会有回字形这种情况出现
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50;
int n;
struct point
{
int x,y;
bool operator < (const point &a)const
{
if (x==a.x)
return y<a.y;
return x<a.x;
}
}p[maxn];
struct ret
{
point p1,p2;
int area;
}r[maxn*maxn];
int check(int i,int j)
{
if (r[i].p2.x<r[j].p1.x)return 1;
if (r[i].p2.y<r[j].p1.y)return 1;
if (r[i].p1.x>r[j].p2.x)return 1;
if (r[i].p1.y>r[j].p2.y)return 1;
if (r[i].p1.x<r[j].p1.x && r[i].p1.y<r[j].p1.y && r[i].p2.x>r[j].p2.x && r[i].p2.y>r[j].p2.y)
return 2;
else
return 0;
}
int vis[250][250];
int main()
{
while (scanf("%d",&n)!=EOF&&n)
{
memset(vis,0,sizeof(vis));
for (int i = 0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
vis[p[i].x][p[i].y]=1;
}
sort(p,p+n);
int cnt = 0;
for (int i = 0;i<n;i++)
{
for (int j = i+1;j<n;j++)
{
if (p[j].x>p[i].x && p[j].y>p[i].y)
{
if (vis[p[i].x][p[j].y] && vis[p[j].x][p[i].y])
{
r[cnt].p1.x=p[i].x;
r[cnt].p1.y=p[i].y;
r[cnt].p2.x=p[j].x;
r[cnt].p2.y=p[j].y;
r[cnt++].area=(p[j].x-p[i].x)*(p[j].y-p[i].y);
}
}
}
}
int ans = -1;
for (int i = 0;i<cnt;i++)
for (int j = 0;j<cnt;j++)
{
if (check(i,j)==1)
ans = max(ans,r[i].area+r[j].area);
else if (check(i,j)==2)
ans = max(ans,max(r[i].area,r[j].area));
}
if (ans==-1)
puts("imp");
else
printf("%d\n",ans);
}
}