poj.2318

来源:互联网 发布:corn表达式生成算法 编辑:程序博客网 时间:2024/06/05 03:43

这题是几何的入门题,主要是考察点与线段的叉积,思路和题意都很简单,主要的思路就是先用两个线段表示各个区域,接着就是判断给出的点是属于哪个区域了,这个时候就要求用点与线段的叉积了,除开点落在开始的x=x1或者是落在x=x2线段上,题目中已经说了,点可以落在区域的边界上,仍属于这个区域,点不可能落在分割线上或者是落在区域外,那么剩下的就是平常的利用叉积判断点落在那个区域了,思路很清晰,下面是我的代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define Max 5000int 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;}