矩形判断

来源:互联网 发布:mysql存储过程有什么用 编辑:程序博客网 时间:2024/05/29 17:44
时间限制: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条线段是否恰好围成矩形。

样例输入
30 0 0 11 0 1 10 1 1 11 0 0 00 1 2 31 0 3 23 2 2 31 0 0 10 1 1 01 0 2 02 0 1 11 1 0 1
样例输出
YESYES

NO

思路分析:

      这道题目,思路比较好像,要判断是否是矩阵:1、给出的线段是否只有四个点    2、给出的线段是否两两相等且平行  3、给出的线段不平行的线段是否向量积为0.

#include<iostream>using 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;}


原创粉丝点击