Note double指定次數越少越好
#include<stdio.h> #include<cstring> #include<cmath> #define MAX 110 #define EPS 1E-8 using namespace std; class Point { public: double x,y; Point(){x=0,y=0;} void Print(){printf("(%.2lf %.2lf)",x,y);} }; class Segment { public: Point aa,bb; Segment(){} Segment(const Point _aa,const Point _bb):aa(_aa),bb(_bb){} void set(Point _aa,Point _bb){aa=_aa,bb=_bb;} void Print(){aa.Print();bb.Print();puts("\n");} }; Segment Sgs[MAX]; int Sgscnt; double Cross(Point _A,Point _B,Point _O) { return ((_A.x-_O.x)*(_B.y-_O.y)-(_B.x-_O.x)*(_A.y-_O.y)); } bool Check(Segment sg) { //sg.Print(); if((abs(sg.aa.x-sg.bb.x)<EPS)&& (abs(sg.aa.y-sg.bb.y)<EPS)) return false; for(int lx=0;lx<Sgscnt;lx++) if(Cross(sg.aa,sg.bb,Sgs[lx].aa)*Cross(sg.aa,sg.bb,Sgs[lx].bb)>EPS) return false; return true; } int main() { int T;scanf("%d",&T); while(T--) { scanf("%d",&Sgscnt); for(int lx=0;lx<Sgscnt;lx++) scanf("%lf %lf %lf %lf",&Sgs[lx].aa.x,&Sgs[lx].aa.y,&Sgs[lx].bb.x,&Sgs[lx].bb.y); bool CHECK=(Sgscnt<3); for(int lx=0;lx<Sgscnt&&!CHECK;lx++) { for(int ly=lx+1;ly<Sgscnt&&!CHECK;ly++) { if(Check(Segment(Sgs[lx].aa,Sgs[ly].aa))) CHECK=true; else if(Check(Segment(Sgs[lx].aa,Sgs[ly].bb))) CHECK=true; else if(Check(Segment(Sgs[lx].bb,Sgs[ly].aa))) CHECK=true; else if(Check(Segment(Sgs[lx].bb,Sgs[ly].bb))) CHECK=true; } } if(CHECK) printf("Yes!\n"); else printf("No!\n"); } return 0; }
沒有留言:
張貼留言