题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。
题解:通过斜率判断一个点是否在两条线段之间。
/** 通过斜率比较点是否在两线段之间 */ #include"iostream" #include"cstdio" #include"algorithm" #include"cstring" using namespace std; const int N=1005; struct edgeP //边上的一个点 { int x1,x2; }e[N]; struct point { int x,y; }p[N]; int cmp(edgeP a,edgeP b) { return a.x1<=b.x1; } int x1,y1,x2,y2; bool is_z(point e1,point e2) // /型斜线 { if((e1.y-e2.y)*(e1.x-e2.x)>=0) return true; else return false; } bool is_f(point e1,point e2) // \型斜线 { if((e1.y-e2.y)*(e1.x-e2.x)<=0) return true; else return false; } bool is_inzr(point e1,point e2,point p) // 在/型斜线的右边 { if((e1.y-e2.y)*(e1.x-e2.x)>=0) { if((p.x-e2.x>0)&&(e1.y-e2.y)*(p.x-e2.x)>(p.y-e2.y)*(e1.x-e2.x)) return true; } return false; } bool is_infl(point e1,point e2,point p) // 在\型斜线的左边 { if((e1.y-e2.y)*(e1.x-e2.x)<=0) { if((p.x-e2.x<0)&&(e1.y-e2.y)*(p.x-e2.x)<(p.y-e2.y)*(e1.x-e2.x)) return true; } return false; } bool is_in(point e1,point e2,point e3,point e4,point p) // 点是否在两线内 { if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) // 点在/.\型两线间 return true; if((is_z(e1,e2)&&is_inzr(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) // 点在/./型两线间 return true; if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_f(e3,e4)&&is_infl(e3,e4,p))) //点在\.\型两线间 return true; if((is_f(e1,e2)&&!is_infl(e1,e2,p))&&(is_z(e3,e4)&&!is_inzr(e3,e4,p))) //点在\./型两线间 return true; return false; } int main() { int n,m; while(cin>>n) { if(n==0) return 0; e[0].x1=0,e[0].x2=0; cin>>m>>x1>>y1>>x2>>y2; for(int i=1;i<=n;i++) { scanf("%d%d",&e[i].x1,&e[i].x2); } for(int i=0;i<m;i++) { scanf("%d%d",&p[i].x,&p[i].y); } e[n+1].x1=x2,e[n+1].x2=x2; sort(e,e+n+2,cmp); int cnt[N]; memset(cnt,0,sizeof(cnt)); for(int i=0;i<=n;i++) { for(int j=0;j<m;j++) { point e1,e2; e1.x=e[i].x1,e1.y=y1; e2.x=e[i].x2,e2.y=y2; point e3,e4; e3.x=e[i+1].x1,e3.y=y1; e4.x=e[i+1].x2,e4.y=y2; /*{ cout<<'('<<e1.x<<','<<e1.y<<')'<<" "<<'('<<e2.x<<','<<e2.y<<')'<<endl; cout<<'('<<e3.x<<','<<e3.y<<')'<<" "<<'('<<e4.x<<','<<e4.y<<')'<<endl; cout<<'('<<p[j].x<<','<<p[j].y<<')'<<endl; }*/ if(is_in(e1,e2,e3,e4,p[j])) { cnt[i]++; //cout<<"cnt"<<i<<"++++++++++++++++++++++"<<endl; } } //cout<<"-------------------------------------------"<<endl; } /*for(int i=0;i<=n;i++) { cout<<cnt[i]<<' '; }*/ sort(cnt,cnt+n+1); puts("Box"); int j=cnt[0],count=1; cnt[n+1]=-10; for(int i=1;i<=n+1;i++) { if(cnt[i]==j) { count++; } else { if(j!=0) printf("%d: %d\n",j,count); j=cnt[i]; count=1; } } } }
Description
Input
Output
Sample Input
4 10 0 10 100 0 20 20 80 80 60 60 40 40 5 10 15 10 95 10 25 10 65 10 75 10 35 10 45 10 55 10 85 10 5 6 0 10 60 0 4 3 15 30 3 1 6 8 10 10 2 1 2 8 1 5 5 5 40 10 7 9 0
Sample Output
Box 2: 5 Box 1: 4 2: 1