uva 11800 基础几何的图形判断

来源:互联网 发布:mv软件 编辑:程序博客网 时间:2024/05/18 01:58
#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度,+临边相等——正方形,-长方形

对边相等,+临边相等——菱形,-平行四边形

某对边平行,梯形,否则普通四边形。

0 0
原创粉丝点击