传送门:HihoCoder1442 Smallest Rectangle
题目描述
测试样例
Sample Input
9
0 0
0 1
0 4
1 0
1 1
1 4
4 0
4 1
4 4
Sample Output
1
题目大意
给定N个二维坐标,问这些二维坐标能组成的四个边与轴平行的矩形的最小面积是多少。
解题思路
双重for循环枚举两两点,当两个点是对角点时,可以判断构成要求矩形(四个边与轴平行)的另外两个对角点是否存在,存在更新最小面积即可。
注意坐标数据有点大,要用long long。
AC代码
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAXN=1005;
const ll INF=0x3f3f3f3f3f3f3f3f;
typedef pair<int,int> P;
P p[MAXN];
map<P,bool> mp;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].first,&p[i].second);
mp[p[i]]=1;
}
ll x,y,ans=INF;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
// 两个点在同一条线上
if(p[i].first==p[j].first || p[i].second==p[j].second)
continue; // 因为两个点在同一条线上就无法确定另外两个点坐标
// 构成题目要求矩形的另外两个对角点存在
if(mp[P(p[i].first,p[j].second)] && mp[P(p[j].first,p[i].second)])
{
x=abs(p[i].first-p[j].first);
y=abs(p[i].second-p[j].second);
ans=min(x*y,ans);// 更新最小面积
}
}
}
if(ans==INF)
printf("-1\n");
else
printf("%d\n",ans);
return 0;
}