这题是几何的入门题,主要是考察点与线段的叉积,思路和题意都很简单,主要的思路就是先用两个线段表示各个区域,接着就是判断给出的点是属于哪个区域了,这个时候就要求用点与线段的叉积了,除开点落在开始的x=x1或者是落在x=x2线段上,题目中已经说了,点可以落在区域的边界上,仍属于这个区域,点不可能落在分割线上或者是落在区域外,那么剩下的就是平常的利用叉积判断点落在那个区域了,思路很清晰,下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 5000
int n,m;
int x1,y1,x2,y2;
int count[Max+10];
struct point
{
int x;
int y;
};
point Point[Max];
struct Line
{
point a;
point b;
};
Line line[Max+10];
struct Node
{
Line l1;
Line l2;
};
Node node[Max+10];
int Intersect(const point p,const Line li)//叉积
{
if((li.a.x-p.x)*(li.b.y-p.y)-(li.a.y-p.y)*(li.b.x-p.x)<0)
return 1;
return -1;
}
int main()
{
while(scanf("%d",&n),n){
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
int i,j,a,b;
line[0].a.x=x1;
line[0].a.y=y1;
line[0].b.x=x1;
line[0].b.y=y2;
line[n+1].a.x=x2;
line[n+1].a.y=y1;
line[n+1].b.x=x2;
line[n+1].b.y=y2;
for(i=0;i<n;i++){
scanf("%d%d",&a,&b);
line[i+1].a.x=a;
line[i+1].a.y=y1;
line[i+1].b.x=b;
line[i+1].b.y=y2;
}
for(i=0;i<=n;i++){
node[i].l1=line[i];
node[i].l2=line[i+1];
}
memset(count,0,sizeof(count));
for(i=0;i<m;i++){
scanf("%d%d",&Point[i].x,&Point[i].y);
if(Point[i].x==x1){
count[0]++;
continue;
}
else if(Point[i].x==x2){
count[n]++;
continue;
}
for(j=0;j<=n;j++){
if(Intersect(Point[i],node[j].l1)*Intersect(Point[i],node[j].l2)<0)
{
count[j]++;
break;
}
}
}
for(i=0;i<=n;i++)
printf("%d: %d\n",i,count[i]);
printf("\n");
}
return 0;
}