标签:
满足这些条件就可以了
小知识点:
两个向量垂直(x1,y1),(x2,y2) x1 * x2 + y1 * y2 == 0;
两个向量平行(x1,y2),(x2,y2) x1 * y2 - x2 * y2 == 0;
给出平面上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 class Node { 2 public: 3 int x,y; 4 Node(){} 5 Node(int x,int y):x(x),y(y) {} 6 bool operator < (const Node& rhs) const { 7 return (x == rhs.x) ? y < rhs.y : x < rhs.x; 8 } 9 10 bool operator == (const Node& rhs) const { 11 return x == rhs.x && y == rhs.y; 12 } 13 }; 14 15 class Line { 16 public: 17 Node L1,L2; 18 Line() {} 19 Line(Node L1,Node L2):L1(L1),L2(L2){} 20 bool operator < (const Line& rhs) const { 21 return L1 == rhs.L1 ? L2 < rhs.L2 : L1 < rhs.L1; 22 } 23 }; 24 25 int main () { 26 int N; 27 //FR("1.txt"); 28 cin >> N; 29 while (N--) { 30 set<Node> S; // 存储边的向量 31 set<Node> Point; // 存储点 4个点 32 vector<Node> V; // 用来给边排序,因为给的边的点不确定 33 set<Line> L;//存储边 4条边 34 REP(i,4) { 35 int x1,y1,x2,y2; 36 V.clear(); 37 cin >> x1 >> y1 >> x2 >> y2; 38 Point.insert(Node(x1,y1)); 39 Point.insert(Node(x2,y2)); 40 V.push_back(Node(x1,y1)); 41 V.push_back(Node(x2,y2)); 42 sort(V.begin(),V.end()); 43 S.insert(Node(V[1].x - V[0].x,V[1].y - V[0].y)); 44 L.insert(Line(V[0],V[1])); 45 } 46 if (S.size() == 2 && Point.size() == 4 && L.size() == 4) { 47 // 接下来判断的是垂直 48 Node now[2]; 49 set<Node>::iterator Iter = S.begin(); 50 now[0] = *Iter++; 51 now[1] = *Iter; 52 if (now[0].x * now[1].x + now[0].y * now[1].y == 0) { 53 cout << "YES" << endl; 54 }else cout << "NO" << endl; 55 } 56 else cout << "NO" << endl; 57 } 58 }
标签:
原文地址:http://www.cnblogs.com/xiaoshanshan/p/4299823.html