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 }

 

posted @ 2013-03-27 16:37  xxx0624  阅读(282)  评论(0编辑  收藏  举报