POJ 2398 排序+叉积判断点与直线位置关系+统计

来源:互联网 发布:索尼网络经销商 编辑:程序博客网 时间:2024/06/06 20:02

题目与POJ2318基本一样
不同之处是需要对直线位置从左到右(按照平面直角坐标系的习惯)进行排序,最后对结果进行统计即可

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define maxn 1000+10struct point{    int x,y;};struct Line{    point a,b;  };int n;int ans[maxn];int cnt[maxn];Line line[maxn];using namespace std;void output(){    cout<<"Box"<<endl;    for(int i=0;i<=n;i++)    {        if(ans[i]!=0)            cnt[ans[i]]++;    }    for(int i=0;i<=n;i++)    {        if(cnt[i]!=0)            printf("%d: %d\n",i,cnt[i]);    }}bool cmp(Line l1,Line l2){    if(l1.a.x<l2.a.x && l1.b.x<l2.b.x)        return true;     else        return false;}int cross(point p0,point p1,point p2){    return  (p0.x-p2.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p0.y-p2.y);}void search(point toy){    for(int i=0;i<=n;i++)    {        if(cross(toy,line[i].a,line[i].b)>0 && cross(toy,line[i+1].a,line[i+1].b)<0)            ans[i]++;    }}int main(){    int m,x1,y1,x2,y2;    int u,l,xj,yj;    point toy;     while(scanf("%d",&n) && n!=0)    {        memset(ans,0,sizeof(ans));        memset(cnt,0,sizeof(cnt));        scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);        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(int i=1;i<=n;i++)        {            scanf("%d%d",&u,&l);            line[i].a.x=u;            line[i].a.y=y1;            line[i].b.x=l;            line[i].b.y=y2;        }        sort(line+1,line+n+1,cmp);        for(int i=0;i<m;i++)        {            scanf("%d%d",&xj,&yj);            toy.x=xj;            toy.y=yj;            search(toy);        }        /*        for(int i=0;i<=n;i++)            printf("%d: %d\n",i,ans[i]);        cout<<endl;*/        output();    }}
0 0