解题思路:我是先求出截线段的直线的方程,再判断。方法比较笨,看到网上还有叉积的方法,以后在研究吧,先记下了
#include<stdio.h>
#define MAX 5003
struct Partion{
double k;
int x,count;
}par[MAX];
int inbin(int i,int x,int y);
int n,m,x1,y1,x2,y2,xt,yt;
int main(void){
int i,j;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); par[0].k=0; par[0].x=x1; par[0].count=0;
int U,L,yb=y1-y2;
for(i=1;i<=n;i++){ scanf("%d%d",&U,&L);
if(U==L){
par[i].k=0; par[i].x=U; par[i].count=0;
}
else{
par[i].k=((double)(yb))/(U-L);
par[i].count=0; par[i].x=U;
}
}
par[i].k=0; par[i].x=x2; par[i].count=0;
for(j=0;j<m;j++){
scanf("%d%d",&xt,&yt);
for(i=0;i<n+1;i++){
if(inbin(i,xt,yt)!=0){ par[i].count++; break;}
}
}
for(i=0;i<n+1;i++){
printf("%d: %d\n",i,par[i].count);
}
printf("\n");
}
return 0;
}
int inbin(int i,int x,int y){
double bt;
int big=0,small=0;
if(par[i].k==0){
if(x>par[i].x) big=1;
}
else{
bt=par[i].k*(x-par[i].x)+y1;
if(par[i].k>0){
if(y<bt) big=1;
}
else {
if(y>bt)big=1;
}
}
if(big==1){
if(par[i+1].k==0){
if(x<par[i+1].x) small=1;
}
else{
bt=par[i+1].k*(x-par[i+1].x)+y1;
if(par[i+1].k>0){
if(y>bt) small=1;
}
else {
if(y<bt)small=1;
}
}
}
return (big==1&&small==1);
}