POJ3304+几何
题意:给定一些点,问是否能找到一条直线,使得这条直线与所有的线段都有交点
因为n很小,所以可以枚举。
当某条线段的两点在“直线”的一侧时,即不合题意。。。。
View Code
1 /* 2 几何+判断直线与线段相交 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 //#include<map> 11 #include<math.h> 12 using namespace std; 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 205; 16 const int inf = 0x7fffffff; 17 const double pi=acos(-1.0); 18 const double eps = 1e-8; 19 struct Point { 20 double x,y; 21 }; 22 Point point[ maxn ]; 23 int n; 24 25 int sig( double d ){ 26 if( d>eps ) return 1; 27 if( d<-eps ) return -1; 28 return 0; 29 } 30 31 double xmult( Point sp,Point ep,Point op ){ 32 return ( sp.x-op.x )*( ep.y-op.y )-( sp.y-op.y )*( ep.x-op.x ); 33 } 34 35 int Intersection( Point a,Point b,Point c,Point d ){ 36 int d1,d2; 37 d1 = sig(xmult( a,c,b )); 38 d2 = sig(xmult( a,d,b )); 39 if( d1*d2==-1 ) return 1;//规范相交 40 if( d1==0||d2==0 ) return 2;//非规范相交 41 return 0;//不相交 42 } 43 bool test( Point a,Point b ){ 44 if( sig(a.x-b.x)==0&&sig(a.y-b.y)==0 ) 45 return false;//排除序相同的点 46 for( int i=1;i<2*n;i+=2 ){ 47 if( Intersection( a,b,point[i],point[i+1] )==0 ) 48 return false; 49 } 50 return true; 51 } 52 bool solve( ){ 53 for( int i=1;i<2*n;i++ ){ 54 for( int j=i+1;j<=2*n;j++ ){ 55 if( test(point[i],point[j])==true ) 56 return true; 57 } 58 } 59 return false; 60 } 61 int main(){ 62 int ca; 63 scanf("%d",&ca); 64 while( ca-- ){ 65 scanf("%d",&n); 66 for( int i=1;i<=2*n;i++ ){ 67 scanf("%lf%lf",&point[ i ].x,&point[ i ].y); 68 } 69 if( solve()==true ) 70 printf("Yes!\n"); 71 else 72 printf("No!\n"); 73 } 74 return 0; 75 }
keep moving...