我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

F1120——计算几何——多边形内点

Posted on 2008-09-02 20:09 Hero 阅读(243) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
 1 //Accepted 1120 C++ 0.02s 190K 054100526 FZU
 2 
 3 //点在多边形内
 4 //不满足 z=px+qy 的个数为(p-1)*(q-1)/2
 5 
 6 #include <stdio.h>
 7 #include <stdlib.h>
 8 #include <string.h>
 9 
10 #define offset 10000
11 #define eps 1e-8
12 #define zero(x) (((x)>0?(x):-(x))<eps)
13 #define _sign(x) ((x)>eps?1:((x)<-eps?2:0))
14 const int INF = 99999999 ;
15 const int size = 20 ;
16 
17 struct point
18 {
19     double x ;
20     double y ;
21 };
22 struct point pt[size] ;
23 
24 double minx, miny ;
25 double maxx, maxy ;
26 int inn ; int inp, inq ; int ct ;
27 
28 void input() 
29 {
30     minx = miny = INF ;    maxx = maxy = -1*INF ;
31     forint i=0; i<inn; i++ )
32     {
33         scanf( "%lf %lf"&pt[i].x, &pt[i].y ) ;
34         //if( minx > pt[i].x ) minx = pt[i].x ;
35         //if( miny > pt[i].y ) miny = pt[i].y ;
36 
37         //if( maxx < pt[i].x ) maxx = pt[i].x ;
38         //if( maxy < pt[i].x ) maxy = pt[i].y ;
39     }    
40 }
41 
42 double xmult(point p1,point p2,point p0){
43     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
44 }
45 
46 //判点在任意多边形内,顶点按顺时针或逆时针给出
47 //on_edge表示点在多边形边上时的返回值,offset为多边形坐标上限
48 int inside_polygon(point q,int n,point* p,int on_edge=1){
49     point q2;
50     int i=0,count;
51     while (i<n)
52         for (count=i=0,q2.x=rand()+offset,q2.y=rand()+offset;i<n;i++)
53             if (zero(xmult(q,p[i],p[(i+1)%n]))&&(p[i].x-q.x)*(p[(i+1)%n].x-q.x)<eps&&(p[i].y-q.y)*(p[(i+1)%n].y-q.y)<eps)
54                 return on_edge;
55             else if (zero(xmult(q,q2,p[i])))
56                 break;
57             else if (xmult(q,p[i],q2)*xmult(q,p[(i+1)%n],q2)<-eps&&xmult(p[i],q,p[(i+1)%n])*xmult(p[i],q2,p[(i+1)%n])<-eps)
58                 count++;
59     return count&1;
60 }
61 
62 void process()
63 {
64     scanf( "%d %d"&inp, &inq ) ;
65 
66     struct point q ; q.x = 0.0 ; q.y = 0.0 ;
67 
68     if( inside_polygon( q, inn, pt, 1 ) )
69     {
70         printf( "The pilot is in danger!\n" ) ;
71         printf( "The secret number is %d.\n", (inp-1)*(inq-1)/2 ) ;
72     }
73     else
74     {
75         printf( "The pilot is safe.\n" ) ;
76     }
77     printf( "\n" ) ;
78 }
79 
80 int main()
81 {
82     //freopen( "in.txt", "r", stdin ) ;
83 
84     ct = 1 ;
85     while( scanf( "%d"&inn ) != EOF && inn )
86     {
87         printf( "Pilot %d\n", ct++ ) ;
88 
89         input() ;
90 
91         process() ;
92 
93         //output() ;
94     }
95 
96     return 0 ;
97 }

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理