题意:
给四个线段(两个端点的坐标)。
判断这四个线段能否构成一个矩形。(矩形的四条边都平行于X轴或Y轴)
思路:
计算几何
代码:
class Point{ public: int x,y; void readd(int xx,int yy){ x=xx; y=yy; } }; class Segment{ public: Point startt,endd; int length; int Type; //1:横 2:竖 -1:斜 void readd(int x1,int y1,int x2,int y2){ startt.readd(x1,y1); endd.readd(x2,y2); length=(int)sqrt((double)(x2-x1)*(x2-x1)+(double)(y2-y1)*(y2-y1)); } int typeCheck(){ Type=-1; if(startt.x==endd.x){ Type=2; } if(startt.y==endd.y){ Type=1; } } }; Segment S[5]; bool samePoint(Point a,Point b){ if(a.x==b.x&&a.y==b.y){ return true; } return false; } bool solve(){ if(S[1].startt.y<S[2].startt.y){ swap(S[1],S[2]); } if(S[1].startt.x>S[1].endd.x){ swap(S[1].startt,S[1].endd); } if(S[2].startt.x>S[2].endd.x){ swap(S[2].startt,S[2].endd); } if(S[3].startt.x>S[4].startt.x){ swap(S[3],S[4]); } if(S[3].startt.y<S[3].endd.y){ swap(S[3].startt,S[3].endd); } if(S[4].startt.y<S[4].endd.y){ swap(S[4].startt,S[4].endd); } if(samePoint(S[1].startt,S[3].startt)&& samePoint(S[1].endd,S[4].startt)&& samePoint(S[3].endd,S[2].startt)&& samePoint(S[2].endd,S[4].endd) ){ return true; } return false; } bool cmp1(Segment a,Segment b){ return a.Type<b.Type; } int main(){ rep(i,1,4){ int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; S[i].readd(x1,y1,x2,y2); S[i].typeCheck(); } rep(i,1,4){ if(S[i].length==0 || S[i].Type==-1){ puts("NO"); return 0; } } sort(S+1,S+5,cmp1); if(!(S[1].length==S[2].length&&S[3].length==S[4].length)){ puts("NO"); return 0; } if(solve()){ puts("YES"); } else{ puts("NO"); } return 0; }
时间: 2024-10-26 19:51:34