zoukankan      html  css  js  c++  java
  • uva 11800 Determine the Shape

      vjudge上题目链接:Determine the Shape

      第二道独自 A 出的计算几何水题,题意就是给你四个点,让你判断它是哪种四边形:正方形、矩形、菱形、平行四边形、梯形 or 普通四边形。

      按照各个四边形的特征层层判断就行,只是这题四个点的相对位置不确定(点与点之间是相邻还是相对并不确定),所以需要枚举各种情况,幸好 4 个点一共只有 3 种不同的情况:abcd、abdc、acbd 画个图就能一目了然,接下来就是编码了,无奈因为一些细节问题我还是调试了还一会 o(╯□╰)o

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 struct Vector {
     8     double x,y;
     9     Vector(double x = 0, double y = 0): x(x), y(y) {}
    10     void readint() {
    11         int x,y;
    12         scanf("%d %d",&x,&y);
    13         this->x = x;
    14         this->y = y;
    15     }
    16     Vector operator + (const Vector &b) const {
    17         return Vector(x + b.x, y + b.y);
    18     }
    19     Vector operator - (const Vector &b) const {
    20         return Vector(x - b.x, y - b.y);
    21     }
    22     Vector operator * (double p) const {
    23         return Vector(x * p, y * p);
    24     }
    25     Vector operator / (double p) const {
    26         return Vector(x / p, y / p);
    27     }
    28 };
    29 
    30 typedef Vector point;
    31 typedef const point& cpoint;
    32 typedef const Vector& cvector;
    33 
    34 Vector operator * (double p, const Vector &a) {
    35     return a * p;
    36 }
    37 
    38 double dot(cvector a, cvector b) {
    39     return a.x * b.x + a.y * b.y;
    40 }
    41 
    42 double length(cvector a) {
    43     return sqrt(dot(a,a));
    44 }
    45 
    46 double cross(cvector a, cvector b) {
    47     return a.x * b.y - a.y *b.x;
    48 }
    49 
    50 const double eps = 1e-10;
    51 int dcmp(double x) {
    52     return fabs(x) < eps ? 0: (x < 0 ? -1 : 1);
    53 }
    54 
    55 bool operator == (cpoint a, cpoint b) {
    56     return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
    57 }
    58 
    59 const char s[8][30] = {"Ordinary Quadrilateral", "Trapezium", "Parallelogram",
    60                 "Rhombus", "Rectangle", "Square" };
    61 
    62 int judge(cpoint a, cpoint b, cpoint c, cpoint d) {
    63     if(dcmp(cross(a - b, c - d)) == 0) {
    64         if(dcmp(cross(b - c, a - d)) == 0) {
    65             if(dcmp(length(b - a) - length(d - a)) == 0) {
    66                 if(dcmp(dot(b - a, d - a)) == 0)    return 5;
    67                 else    return 3;
    68             }
    69             else if(dcmp(dot(b - a, d - a)) == 0)   return 4;
    70             else    return 2;
    71         }
    72         else   return 1;
    73     }
    74     else if(dcmp(cross(b - c, a - d)) == 0)    return 1;
    75     else    return 0;
    76 }
    77 
    78 int main() {
    79     int t,Case = 0;
    80     point a,b,c,d;
    81     scanf("%d",&t);
    82     while(t--) {
    83         a.readint();
    84         b.readint();
    85         c.readint();
    86         d.readint();
    87         printf("Case %d: ",++Case);
    88         int ans = 0;
    89         ans = max(ans, judge(a,b,c,d));
    90         ans = max(ans, judge(a,b,d,c));
    91         ans = max(ans, judge(a,c,b,d));
    92         printf("%s
    ",s[ans]);
    93     }
    94     return 0;
    95 }
    View Code

      计算几何,还是很有趣的。。。

  • 相关阅读:
    Atitit.ide eclipse编译速度慢的解决
    Atitit.ide eclipse编译速度慢的解决
    Atitit.可视化与报表原理与概论
    Atitit.可视化与报表原理与概论
    Atitit.数据检索与网络爬虫与数据采集的原理概论
    Atitit.数据检索与网络爬虫与数据采集的原理概论
    Atitit 游戏的原理与概论attilax总结
    Atitit 游戏的原理与概论attilax总结
    Atiti.ui原理与gui理论
    Atiti.ui原理与gui理论
  • 原文地址:https://www.cnblogs.com/Newdawn/p/4694308.html
Copyright © 2011-2022 走看看