1 条题解

  • 0
    @ 2024-12-24 10:06:18

    C++ :

    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    using namespace std;
    struct Point
    {
        double x,y;
        Point(double x=0,double y=0):x(x),y(y) {}//构造函数,方便代码编写
    };
    typedef Point Vector;
    Vector operator +(Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
    //向量+向量=向量,点+向量=点
    Vector operator -(Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
    Vector operator *(Vector A,double p){return Vector(A.x*p,A.y*p);}
    Vector operator /(Vector A,double p){return Vector(A.x/p,A.y/p);}
    
    bool operator <(const Point& a,const Point& b)
    {
        return a.x<b.x||(a.x==b.x&&a.y==b.y);
    }
    
    const double eps=1e-10;
    
    int dcmp(double x)
    {
        if(fabs(x)<eps) return 0;
        else return x<0?-1:1;
    }
    
    bool operator ==(const Point&a,const Point&b)
    {
        return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
    }
    
    double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
    double Length(Vector A){return sqrt(Dot(A,A));}
    double Angle(Vector A,Vector B){return acos(Dot(A,B)/Length(A)/Length(B));}
    double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}
    double Area2(Point A,Point B,Point C) {return Cross(B-A,C-A);}
    
    double DistanceToSegment(Point P,Point A,Point B)
    {
        if(A==B) return Length(P-A);
        Vector v1=B-A,v2=P-A,v3=P-B;
        if(dcmp(Dot(v1,v2))<0) return Length(v2);
        else if(dcmp(Dot(v1,v3))>0) return Length(v3);
        else return fabs(Cross(v1,v2))/Length(v1);
    }
    
    
    class Vector3
    {
        public:
             Vector3(float fx, float fy, float fz)        :x(fx), y(fy), z(fz)    {    }
             Vector3 operator - (const Vector3& v) const    {        return Vector3(x - v.x, y - v.y, z - v.z) ;    }
             float Dot(const Vector3& v) const
              {        return x * v.x + y * v.y + z * v.z ;    }
              Vector3 Cross(const Vector3& v) const    {        return Vector3(            y * v.z - z * v.y,            z * v.x - x * v.z,            x * v.y - y * v.x ) ;    }
              public:    float x, y, z ;
    };
    
    bool SameSide(Vector3 A, Vector3 B, Vector3 C, Vector3 P)
    {
        Vector3 AB = B - A ;
        Vector3 AC = C - A ;
        Vector3 AP = P - A ;
    
        Vector3 v1 = AB.Cross(AC) ;
        Vector3 v2 = AB.Cross(AP) ;
    
        return v1.Dot(v2) >= 0 ;
    }
    
    bool PointinTriangle1(Vector3 A, Vector3 B, Vector3 C, Vector3 P)
    {
        return SameSide(A, B, C, P) &&
            SameSide(B, C, A, P) &&
            SameSide(C, A, B, P) ;
    }
    
    double sqr(double x) {return x*x;}
    int main()
    {
        //freopen("input.txt","r",stdin);
        Point A,B,C,O;
        //Vector3 a1,b1,c1,o1;
        int num,i;
        scanf("%d",&num);
        for(i=1;i<=num;i++)
        {
            int ans;
            double a,b,r;
            scanf("%lf%lf%lf",&a,&b,&r);
            O.x=a;O.y=b;
            scanf("%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
            Vector3 a1=Vector3(A.x,A.y,0);
            Vector3 b1=Vector3(B.x,B.y,0);
            Vector3 c1=Vector3(C.x,C.y,0);
            Vector3 o1=Vector3(a,b,0);
            if(sqr(A.x)+sqr(B.y)<=r*r&&sqr(B.x)+sqr(B.y)<=r*r&&sqr(C.x)+sqr(C.y)<=r*r)
                ans=1;
            else if(sqr(A.x)+sqr(B.y)>=r*r&&sqr(B.x)+sqr(B.y)>=r*r&&sqr(C.x)+sqr(C.y)>=r*r)
            {
                if(DistanceToSegment(O,A,B)>=r&&DistanceToSegment(O,A,C)>=r&&DistanceToSegment(O,C,B)>=r)
                {
                  if(PointinTriangle1(a1,b1,c1,o1)==1) ans=1;//ans=1 包含
                  else ans=2;//相离
                }
                else ans=3;//有公共
            }
            else ans=3;
            printf("Case #%d: ",i);
            if(ans==1) printf("II\n");
            else if(ans==2) printf("OO\n");
            else if(ans==3) printf("XX\n");
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2607
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者