题目意思为给你四个点的坐标,判断这四个点围成的形状是正方形、矩形、菱形、平行四边形、梯形还是普通的四边形。
按照边长是否平行和对角线是否垂直判断。
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <algorithm> using namespace std; char shape[6][30] = { "Square", "Rectangle", "Rhombus", "Parallelogram", "Trapezium", "Ordinary Quadrilateral", }; const double eps = 1e-8; int sig(double argu) { return (argu > eps) - (argu < -eps); } typedef struct Point { double x, y; Point (double _x = 0.0, double _y = 0.0): x(_x), y(_y) {} Point operator +(const Point &argu) const { return Point(x + argu.x, y + argu.y); } Point operator -(const Point &argu) const { return Point(x - argu.x, y - argu.y); } Point operator *(const double k) const { return Point(x * k, y * k); } Point operator /(const double k) const { return Point(x / k, y / k); } double operator ^(const Point &argu) const { return (x * argu.y - y * argu.x); } double operator *(const Point &argu) const { return (x * argu.x + y * argu.y); } bool operator <(const Point &argu) const { if(sig(y - argu.y) == 0) return x < argu.x; else return y < argu.y; } }Vector; Point vert[4], minv; Vector edge[4], diag[2]; double x, y; bool cmp(Point m, Point n) { double mang = atan2(m.y - minv.y, m.x - minv.x); double nang = atan2(n.y - minv.y, n.x - minv.x); if(sig(mang - nang) == 0) return m.x < n.x; else return mang < nang; } void CheckShape() { if(sig(edge[0] ^ edge[2]) == 0 || sig(edge[1] ^ edge[3]) == 0) { if(sig(edge[0] ^ edge[2]) == 0 && sig(edge[1] ^ edge[3]) == 0) { if(sig(diag[0] * diag[1]) == 0) { if(sig(edge[0] * edge[1]) == 0) puts(shape[0]); else puts(shape[2]); } else if(sig(edge[0] * edge[1]) == 0) puts(shape[1]); else puts(shape[3]); } else puts(shape[4]); } else puts(shape[5]); } int main() { //freopen("11800.in", "r", stdin); int n; scanf("%d", &n); for(int cas = 1; cas <= n; cas++) { printf("Case %d: ", cas); for(int i = 0; i < 4; i++) { scanf("%lf%lf", &x, &y); vert[i] = Point(x, y); } minv = vert[0]; for(int i = 0; i < 4; i++) if(minv < vert[i]) minv = vert[i]; sort(vert, vert + 4, cmp); for(int i = 0; i < 4; i++) edge[i] = vert[i] - vert[(i + 1) % 4]; diag[0] = vert[0] - vert[2]; diag[1] = vert[1] - vert[3]; CheckShape(); } return 0; }