题意:给你一个箱子,已知隔板的位置,在给你玩具的位置,要你算出每个被隔出来的区域里有几个玩具。。。
想法:利用叉乘,某玩具在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 }