POJ2318TOYS(叉乘)

题意:给你一个箱子,已知隔板的位置,在给你玩具的位置,要你算出每个被隔出来的区域里有几个玩具。。。

想法:利用叉乘,某玩具在X区域里,那么,这个点就在第x-1条线的右手边,第x条线的左手边,左右手方向利用叉乘来判断。。另外,我把左右边界也加入进了所以的线里面。。这样就不需要特殊判断了。。。

 1 #include<stdio.h>
 2 #include<string.h>
 3 typedef struct point
 4 {
 5     int x,y;
 6 }point;
 7 typedef struct line
 8 {
 9     point a,b;
10 }line;
11 line l[5010];
12 int n;
13 int cross(point a,point b)
14 {
15     return (a.x*b.y-a.y*b.x);
16 }
17 point getvector(point a,point b)
18 {
19     point get;
20     get.x=b.x-a.x;
21     get.y=b.y-a.y;
22     return get;
23 }
24 int judge(point dot)
25 {
26     int mid,low,high,d1,d2,j;
27 
28     low=0;
29     high=n+1;
30     while(low<=high)
31     {
32         mid=(high+low)/2;
33         d1=cross(getvector(l[mid].a,dot),getvector(l[mid].b,dot));
34         if(d1<=0)
35         {
36             d2=cross(getvector(l[mid-1].a,dot),getvector(l[mid-1].b,dot));
37             if(d2>=0)
38                 return mid-1;
39             else { high=mid-1;}
40         }
41 
42         else  if(d1>=0)
43         {
44             d2=cross(getvector(l[mid+1].a,dot),getvector(l[mid+1].b,dot));
45             if(d2<=0)
46                 return mid;
47             else {low=mid+1;}
48         }
49         
50     }
51     
52 }
53 
54 int main()
55 {
56     int m,i,j,box[5010],mark;
57     point corner1,corner2,dot;
58 
59     scanf("%d",&n);
60     while(n!=0)
61     {
62         scanf("%d %d %d %d %d",&m,&corner1.x,&corner1.y,&corner2.x,&corner2.y);
63         memset(box,0,sizeof(box[0])*(n+3));
64         for(i=1;i<=n;i++)
65         {
66             scanf("%d %d",&l[i].a.x,&l[i].b.x);
67             l[i].a.y=corner1.y;
68             l[i].b.y=corner2.y;
69         }
70         l[0].a=corner1;
71         l[0].b.x=corner1.x;
72         l[0].b.y=corner2.y;
73         l[n+1].a.x=corner2.x;
74         l[n+1].a.y=corner1.y;
75         l[n+1].b=corner2;
76         for(i=0;i<m;i++)
77         {
78             scanf("%d %d",&dot.x,&dot.y);
79             mark=judge(dot);
80             box[mark]++;
81 
82 
83 
84         }
85         for(i=0;i<=n;i++)
86             printf("%d: %d\n",i,box[i]);
87         scanf("%d",&n);
88         if(n!=0)printf("\n");
89         
90 
91 
92     }
93     return 0;
94 }
View Code
原文地址:https://www.cnblogs.com/leeshum/p/3110648.html