首页 > 代码库 > poj 2398 计算几何

poj 2398 计算几何

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 struct point{
 8     int x,y;
 9 };
10 
11 struct line{
12     point a,b;
13 };
14 line lline[5005];
15 
16 int cnt[5005];
17 int res[5005];
18 int cross(point p1,point p2,point p0){
19     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
20 }
21 
22 bool cmp(line c,line d){
23     return c.b.x < d.b.x ;
24 }
25 
26 int main()
27 {
28     int n,m,x1,x2,y1,y2;
29     int t1,t2;
30     point c;
31     while(cin>>n&&n){
32         cin>>m>>x1>>y1>>x2>>y2;
33         lline[0].a.x=x1,lline[0].a.y=y1;
34         lline[0].b.x=x1,lline[0].b.y=y2;
35         lline[n+1].a.x = x2,lline[n+1].a.y=y1;
36         lline[n+1].b.x = x2,lline[n+1].b.y=y2;
37         for(int i=1;i<=n;i++){
38             scanf("%d%d",&t1,&t2);
39             lline[i].a.x=t1;
40             lline[i].a.y=y1;
41             lline[i].b.x=t2;
42             lline[i].b.y=y2;
43         }
44 
45         sort(lline,lline+n+2,cmp);
46        // for(int i=0;i<n+2;i++)
47        //     cout<<lline[i].b.x<<" "<<lline[i].b.y<<" "<<lline[i].a.x<<" "<<lline[i].a.y<<endl;
48         memset(cnt,0,sizeof(cnt));
49         for(int i=0;i<m;i++){
50             cin>>c.x>>c.y;
51             for(int j=0;j<n+2;j++){
52                 //cout<<j<<" "<<cross(c,lline[j].a,lline[j].b)<<endl;
53                 if(cross(c,lline[j].a,lline[j].b)>0){
54                     continue;
55                 }else{
56                     cnt[j-1]++;
57                     break;
58                 }
59             }
60         }
61        // for(int i=0;i<=n;i++)
62        //     cout<<cnt[i]<<endl;
63         memset(res,0,sizeof(res));
64         for(int i=0;i<=n;i++){
65             res[cnt[i]]++;
66         }
67         cout<<"Box"<<endl;
68         for(int i=1;i<=n;i++)if(res[i])
69             cout<<i<<": "<<res[i]<<endl;
70     }
71     return 0;
72 }