UVa11800

来源:互联网 发布:linux下svn 钩子函数 编辑:程序博客网 时间:2024/05/01 20:54

题目链接

分析:
我先进行了点的排序,
在画出了所有点的排列状况后,我用线段相交的判断把点换成了这样

if (XiangJiao(A,B,C,D)) swap(B,C);if (XiangJiao(A,D,B,C)) swap(C,D);

这里写图片描述

之后直接判断边和角的关系就好了:

  • Square(正方形)
    所有的边相等,所有的角相等(等于90°,Dot=0)
  • Rectangle(矩形)
    对边相等,所有的角相等(等于90°,Dot=0)
  • Rhombus(菱形)
    所有边相等,对角相等
  • Parallelogram(平行四边形)
    对边相等,对角相等
  • Trapezium(梯形)
    有一组对边平行

按照以上的顺序判断即可

//这里写代码片#include<cstdio>#include<cstring>#include<iostream>#include<cmath>using namespace std;const double eps=1e-8;struct node{    double x,y;    node (double xx=0,double yy=0)    {        x=xx;y=yy;    }};node operator + (const node &a,const node &b){return node(a.x+b.x,a.y+b.y);}node operator - (const node &a,const node &b){return node(a.x-b.x,a.y-b.y);}node operator * (const node &a,const double &b){return node(a.x*b,a.y*b);}node operator / (const node &a,const double &b){return node(a.x/b,a.y/b);}node operator < (const node &a,const node &b){return a.x<b.x||(a.x==b.x && a.y<b.y);}node operator == (const node &a,const node &b){return a.x==b.x && a.y==b.y;}int dcmp(double x){    if (fabs(x)<eps) return 0;    else if (x>0 ) return 1;    else return -1;}double Cross(node x,node y){return x.x*y.y-x.y*y.x;}double Dot(node x,node y){return x.x*y.x+x.y*y.y;}double Len(node x) {return sqrt(Dot(x,x));}double Angle(node A,node B,node C){    if (dcmp(Dot(A-B,C-B))==0) return 0;                       //90°     return acos( Dot(A-B,C-B) / Len(A-B) / Len(C-B) );}bool XiangJiao(node a1,node a2,node b1,node b2){    double c1=Cross(a2-a1,b1-a1);    double c2=Cross(a2-a1,b2-a1);    double c3=Cross(b2-b1,a1-b1);    double c4=Cross(b2-b1,a2-b1);    return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0;}int main(){    int T;    node A,B,C,D;    scanf("%d",&T);    for (int cas=1;cas<=T;cas++)    {        printf("Case %d: ",cas);        scanf("%lf%lf",&A.x,&A.y);        scanf("%lf%lf",&B.x,&B.y);        scanf("%lf%lf",&C.x,&C.y);        scanf("%lf%lf",&D.x,&D.y);        if (XiangJiao(A,B,C,D)) swap(B,C);        if (XiangJiao(A,D,B,C)) swap(C,D);        double l1=Len(B-A);        double l2=Len(C-B);        double l3=Len(D-C);        double l4=Len(A-D);        double a=Angle(D,A,B);        double b=Angle(A,B,C);        double c=Angle(B,C,D);        double d=Angle(C,D,A);        if (dcmp(a-b)==0&&dcmp(b-c)==0&&dcmp(c-d)==0&&dcmp(l1-l2)==0&&dcmp(l2-l3)==0&&dcmp(l3-l4)==0)          //边角都相等         {            printf("Square\n");            continue;        }        else if (dcmp(a-b)==0&&dcmp(b-c)==0&&dcmp(c-d)==0&&dcmp(l1-l3)==0&&dcmp(l2-l4)==0)                     //对边相等         {            printf("Rectangle\n");            continue;        }        else if (dcmp(l1-l2)==0&&dcmp(l2-l3)==0&&dcmp(l3-l4)==0&&dcmp(a-c)==0&&dcmp(b-d)==0)                   //四边相等         {            printf("Rhombus\n");            continue;        }        else if (dcmp(l1-l3)==0&&dcmp(l2-l4)==0&&dcmp(a-c)==0&&dcmp(b-d)==0)                                  //对边相等         {            printf("Parallelogram\n");            continue;        }        else if (dcmp(Cross(D-A,B-C))==0||dcmp(Cross(B-A,C-D))==0)                                            //有两边平行         {            printf("Trapezium\n");            continue;        }        else        {            printf("Ordinary Quadrilateral\n");            continue;        }    }    return 0;}
原创粉丝点击