两个标准:小面积相加==大面积 ;除了大矩形4个顶点出现1次之外,其余每个顶点出现偶次。
这道题只用判断面积是否相等也能过
优化:结构体映射 ,改成字符串映射.
//两个标准:小面积相加==大面积 ;除了大矩形4个顶点出现1次之外,其余每个顶点出现偶次。
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
struct point
{
int x,y;
friend bool operator < ( point k1,point k2)
{
if( k1.x!=k2.x )
return k1.x<k2.x;
else
return k1.y<k2.y;
}
};
//尝试把 key 转成字符串。
map<point,int> mp;//每个点出现次数的映射 //int 默认为0
map<point,int>::iterator it;
int main()
{
int n;
scanf("%d",&n);
int x_max=-1000000,x_min=10000000,y_max=-1000000,y_min=1000000;
int s=0;
for(int i=0;i<n;i++)
{
int x,y,x1,y1;
scanf("%d%d%d%d",&x,&y,&x1,&y1);
point p1,p2,p3,p4;
p1.x=x, p1.y=y; p2.x=x1, p2.y=y1;
p3.x=x, p3.y=y1; p4.x=x1, p4.y=y;
mp[p1]++;mp[p2]++; mp[p3]++; mp[p4]++;
s+= abs(x-x1) * abs(y-y1);
x_max= max ( x_max, max(x,x1) ) ;
x_min= min ( x_min, min(x,x1) ) ;
y_max= max ( y_max, max(y,y1) ) ;
y_min= min ( y_min, min(y,y1) ) ;
}
if( s != (x_max-x_min)*(y_max-y_min) )
cout<<"No"<<endl;
else
{
//大矩形4个顶点,都相加一次
point p1,p2,p3,p4;
p1.x=x_min, p1.y=y_min; p2.x=x_min, p2.y=y_max;
p3.x=x_max, p3.y=y_min; p4.x=x_max, p4.y=y_max;
mp[p1]++,mp[p2]++,mp[p3]++,mp[p4]++;
//每次都是偶此项
for(it=mp.begin() ;it!=mp.end() ;it++ )
{
if( (it->second %2) !=0 )
{
cout<<"No"<<endl;
return 0;
}
}
cout<<"Yes"<<endl;
}
return 0;
}