題意:給出四條線段的端點,若這四條線段能組成一個平行於座標軸的矩形,且面積爲正,輸出YES,反之NO。
分析:討論,一共四個點,兩條平行x,兩條平行y,每條線段長度必須重複不小於2次。
代碼:
#include<cstdio> #include<cmath> #include<cstring> #include<queue> #include<stack> #include<cstdlib> #include<iomanip> #include<string> #include<vector> #include<map> #include<string> #include<iostream> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f typedef long long ll; #define Max(a,b) (a>b)?a:b #define lowbit(x) x&(-x) int main() { map<int,map<int,int> >mp; map<int,int>mp1; int x[4],y[4],len=0,flag=1,x1[4],y1[4],xx=0,yy=0; for(int i=0; i<4; i++) { scanf("%d%d",&x[i],&y[i]); scanf("%d%d",&x1[i],&y1[i]); mp[x[i]][y[i]]++; mp[x1[i]][y1[i]]++; if((x1[i]==x[i])&&(y1[i]!=y[i])) yy++; else if((x1[i]!=x[i])&&(y1[i]==y[i])) xx++; else flag=0; len=abs(x1[i]-x[i]+y1[i]-y[i]); mp1[len]++; } if(xx!=yy) flag=0; for(int i=0; i<4; i++) { if(mp[x[i]][y[i]]!=2||mp[x1[i]][y1[i]]!=2) flag=0; len=abs(x1[i]-x[i]+y1[i]-y[i]); if(mp1[len]<2) flag=0; } if(flag) puts("YES"); else puts("NO"); }