#include<iostream>
#include<algorithm>
#define MAX 5010
using namespace std;
typedef struct point
{
double x,y;
};
typedef struct line
{
point start,end;
};
int max(int x,int y)
{
return x>y? x:y;
}
int min(int x,int y)
{
return x<y? x:y;
}
double multi(point p0,point p1,point p2)//计算矢量[p0,p1], [p0,p2] 的叉积
{
return (p1.x-p0.x)*(p2.y-p0.y)
-(p2.x-p0.x)*(p1.y-p0.y);
}
bool is_cross(point s1,point e1,point s2,point e2)//判断直线相交
{
return max(s1.x,e1.x)>=min(s2.x,e2.x)&&
max(s2.x,e2.x)>=min(s1.x,e1.x)&&
max(s1.y,e1.y)>=min(s2.y,e2.y)&&
max(s2.y,e2.y)>=min(s1.y,e1.y)&&
multi(s2,e1,s1)*multi(e1,e2,s1)>=0&&
multi(s1,e2,s2)*multi(e2,e1,s2)>=0;//加了等号就包括 端点相交
}
line b[MAX];
point t;
int ans[MAX];
int main()
{
int board,toy,i,j,k;
point Y,X,S;
while(cin>>board)
{ if(board==0) break;
cin>>toy>>Y.x>>Y.y>>X.x>>X.y;
S.x=Y.x; S.y=X.y;
memset(ans,0,sizeof(ans));
for(i=1;i<=board;i++)
{
cin>>b[i].start.x>>b[i].end.x;
b[i].start.y=Y.y;
b[i].end.y =X.y;
}
for(i=1;i<=toy;i++)
{
cin>>t.x>>t.y;k=0;
for(j=1;j<=board;j++)
{
if(is_cross(S,t,b[j].start,b[j].end))
k=j;
}
ans[k]=ans[k]+1;
}
for(i=0;i<=board;i++)
cout<<i<<": "<<ans[i]<<endl;
}
return 0;
}
pku2318 自己想的 超时
最新推荐文章于 2023-09-04 23:26:45 发布