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

原创 2016年08月28日 23:36:54

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

#define maxn 1000+10

struct 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();
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

判断两条线段是否相交(三种算法)

算法1:   [cpp] view plaincopy ///----------alg 1------------   struct Po...
  • yanjunmu
  • yanjunmu
  • 2015年07月02日 17:49
  • 6681

计算几何问题汇总--点与线的位置关系

点与点之间, 线与线之间,点与线之间的位置关系是一类非常重要的问题。它不仅是平面几何学的基石,也常常应用于LBS(Location Based Service),社交网络,以及数据库查询等领域。本文中...
  • guoziqing506
  • guoziqing506
  • 2016年09月20日 08:53
  • 3970

判断两条线段是否相交 计算几何

对于线段A,B 线段A与直线B相交 ,线段B与直线A相交 ,那么就可以认为线段A 和线段B相交。 关键问题是:如何判断直线AB是否与线段CD相交呢? 设直线AB的方程为:f(x,y) = 0,直线方程...
  • exchan
  • exchan
  • 2016年12月08日 21:31
  • 2056

poj2398Toy Storage【判断直线与点位置关系+排序+二分查找】

Language: Default Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 463...
  • R1986799047
  • R1986799047
  • 2015年08月28日 00:48
  • 269

poj 2398 叉积判断点位置

今天起开始进攻计算几何题目~ 第一题……Rumtime了2次(某变量下标出错),WA了1次(输出排序出错……)郁闷,我明明都已经很仔细检查代码了。 题目貌似有点长,我稍微解释一下。 ...
  • wuxinliulei
  • wuxinliulei
  • 2013年07月04日 00:40
  • 985

POJ 2398 Toy Storage (判断点与直线关系+排序二分计数)

Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4851   Accepted: 2878...
  • helloiamclh
  • helloiamclh
  • 2015年12月07日 21:27
  • 128

poj 2398 Toy Storage 【统计相同个数的点的 区域个数】【二分+叉积判断】

Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4837   Accepted: 2869...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年12月01日 16:59
  • 243

POJ2318 叉积判断点与直线的关系

利用叉积判断点和直线的位置关系,确定点在直线的左侧还是右侧 通过查找比较点与各个直线(隔板)之间的关系,确定点所在的区间查找可以用一般方法,因为直线是有序的,但需要考虑0和n的特殊情况。#inclu...
  • legend_PawN
  • legend_PawN
  • 2016年08月28日 23:32
  • 149

POJ 2318 TOYS(叉积判断点与线段的位置关系)

Description Calculate the number of toys that land in each bin of a partitioned toy box.  Mom and d...
  • SSimpLe_Y
  • SSimpLe_Y
  • 2017年06月20日 16:30
  • 598

poj 2318 叉积解点和直线的关系

要判断点的位置,就是利用二分法判断和分界线的相对位置,最终确定点的所在块,利用数组,判断点的位置时利用叉积算有方向的面积. #include #include #include #includ...
  • qq_24451605
  • qq_24451605
  • 2015年01月27日 20:36
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2398 排序+叉积判断点与直线位置关系+统计
举报原因:
原因补充:

(最多只允许输入30个字)