矩形判断

时间限制: 1000ms 单点时限: 1000ms 内存限制: 256MB 描述
给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。
输入
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。
输出
每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。
样例输入

3 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 1 2 3 1 0 3 2 3 2 2 3 1 0 0 1 0 1 1 0 1 0 2 0 2 0 1 1 1 1 0 1

样例输出
YES YES

NO
思路分析:
这道题目,思路比较好像,要判断是否是矩阵:1、给出的线段是否只有四个点2、给出的线段是否两两相等且平行3、给出的线段不平行的线段是否向量积为0.
【矩形判断】
#includeusing namespace std; int a[10][3]; int b[5][3]; int main() { int t; int i=1; int flag=0; int x1,x2,y1,y2; scanf("%d",&t); while(i<=t) { flag=0; int j=1; int j1; int mini=0; while(j<=4) { scanf("%d%d%d%d",&a[2*j-1][1],&a[j*2-1][2],&a[j*2][1],&a[j*2][2]); b[j][1]=a[j*2][1]-a[j*2-1][1]; b[j][2]=a[j*2][2]-a[j*2-1][2]; if(b[j][1]<0) { b[j][1]=-b[j][1]; b[j][2]=-b[j][2]; } j++; }//排个序更容易看; for(j=1; j<8; j++) { mini=j; for(j1=j+1; j1<=8; j1++) { if(a[mini][1]>a[j1][1]) { mini=j1; } else { if(a[mini][1]==a[j1][1]) { if(a[mini][2]>a[j1][2]) { mini=j1; } } } } x1=a[j][1]; y1=a[j][2]; a[j][1]=a[mini][1]; a[j][2]=a[mini][2]; a[mini][1]=x1; a[mini][2]=y1; } for(j=1; j<=4; j++) { if(a[j*2][1]!=a[j*2-1][1]||a[j*2][2]!=a[j*2-1][2]) { flag=1; }}for(j=1; j<4; j++) { mini=j; for(j1=j+1; j1<=4; j1++) { if(b[mini][1]>b[j1][1]) { mini=j1; } else { if(b[mini][1]==b[j1][1]) { if(b[mini][2]>b[j1][2]) { mini=j1; } } } } x1=b[j][1]; y1=b[j][2]; b[j][1]=b[mini][1]; b[j][2]=b[mini][2]; b[mini][1]=x1; b[mini][2]=y1; } for(j=1; j<=2; j++) { if(b[j*2][1]!=b[j*2-1][1]||b[j*2][2]!=b[j*2-1][2]) { flag=1; }} if(b[1][1]*b[3][1]+b[1][2]*b[3][2]!=0) { flag=1; } if(flag==1) { printf("NO\n"); } else { printf("YES\n"); } i++; } return 0; }



    推荐阅读