1 条题解
-
0
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
- 上传者