#include <bits/stdc++.h> using namespace std; int T, kase, a, b; char res[7][30] = {"", "Square", "Rectangle", "Rhombus", "Parallelogram", "Trapezium", "Ordinary Quadrilateral"}; struct Point { int x, y; Point(int x = 0, int y = 0): x(x), y(y) { } Point(const Point& rhs) : x(rhs.x), y(rhs.y) { } }; typedef Point Vector; Vector operator + (const Vector& A, const Vector& B) { return Vector(A.x + B.x, A.y + B.y); } Vector operator - (const Point& A, const Point& B) { return Vector(A.x - B.x, A.y - B.y); } Vector operator * (const Vector& A, int p) { return Vector(A.x * p, A.y * p); } bool operator == (const Point& a, const Point &b) { return a.x == b.x && a.y == b.y; } bool operator < (const Point& p1, const Point& p2) { return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y); } int Dot(const Vector& A, const Vector& B) { return A.x * B.x + A.y * B.y; } int Cross(const Vector& A, const Vector& B) { return A.x * B.y - A.y * B.x; } int Length(const Vector& A) {return Dot(A, A);} vector<Point> ConvexHull(vector<Point>& p) { // 预处理,删除重复点 sort(p.begin(), p.end()); p.erase(unique(p.begin(), p.end()), p.end()); int n = p.size(); int m = 0; vector<Point> ch(n + 1); for (int i = 0; i < n; i++) { while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) < 0) m--; ch[m++] = p[i]; } int k = m; for (int i = n - 2; i >= 0; i--) { while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) < 0) m--; ch[m++] = p[i]; } if (n > 1) m--; ch.resize(m); return ch; } Point read_point() { scanf("%d%d", &a, &b); return Point(a, b); } int solve() { vector<Point> p; for (int i = 0; i < 4; i++) p.push_back(read_point()); vector<Point> points = ConvexHull(p); if (points.size() != 4) return 6; Point& A = points[0], & B = points[1], & C = points[2], & D = points[3]; Vector BA = B - A, DA = D - A, CD = C - D, CB = C - B; int lBA = Length(BA), lDA = Length(DA), lCD = Length(CD), lCB = Length(CB); if (Dot(BA, DA) == 0 && Dot(DA, CD) == 0 && Dot(CD, CB) == 0) if (lBA == lDA) return 1; else return 2; if (lBA == lCD && lDA == lCB) if (lBA == lDA) return 3; else return 4; if (Cross(BA, CD) == 0 || Cross(DA, CB) == 0) return 5; return 6; } int main(int argc, char const *argv[]) { scanf("%d", &T); while (T--) printf("Case %d: %s\n", ++kase, res[solve()]); return 0; }
给无序的4个点,问是什么四边形。
自然是先凸包算法排序,
三个角90度,+临边相等——正方形,-长方形
对边相等,+临边相等——菱形,-平行四边形
某对边平行,梯形,否则普通四边形。