POJ 2318 TOYS(计算几何)

时间:2022-09-03 22:44:23

题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具

解题思路:因为线段是有序给出,所以不用排序,判断某个点在哪个区域,采用二分法,将某个点和线段的叉积来判断这个点是在线的左边或者右边,根据这个来二分找出区域

代码和思路参考与此链接:http://blog.csdn.net/wangjian8006

这也算我入门计算几何的第一道题了,首先看了一些有关资料,了解到叉积的重要性!!有2点,p1,p2构成一条线段L,L左边有一点p3,右边有一点p4,则(p1-p2)x(p3-p1)>0,(p1-p2)x(p4-p1)<0。

也就是说在L左边的点叉积>0,右边的<0。

剩下的就是二分找答案了,在记录到数组中,最后输出。

#include <iostream>
using namespace std;
#define _MAXL_ 5010 typedef struct{
int x, y;
}POINT; typedef struct{
POINT first,second;
}LINE; class CBox{
private:
int nTop,nLeft,nRight,nButtom;
int nCountLine; //记录盒子里有多少条线
LINE *pLine; //记录线的信息
int *pRange; //记录区间中的玩具有多少个
int Multi(POINT p1,POINT p2,POINT p0); //叉积计算
public:
CBox();
virtual ~CBox();
void SetBorder(int top,int left,int right,int buttom); //设置盒子矩形坐标
void AddLine(int first,int second); //在盒子中增加一条线
int GetRange(int val); //得到某个区间中的玩具个数
void SetToy(POINT toy); //在盒子里放一个玩具
}; CBox::CBox(){
nCountLine = 0;
pLine = new LINE[_MAXL_];
pRange = new int[_MAXL_];
memset(pRange,0,sizeof(pRange)*_MAXL_);
} CBox::~CBox(){
delete []pLine;
delete []pRange;
} void CBox::SetBorder(int top,int left,int right,int buttom){
nTop = top;
nLeft = left;
nRight = right;
nButtom = buttom;
} void CBox::AddLine(int topx,int buttomx){
pLine[nCountLine].first.x = topx;
pLine[nCountLine].first.y = nTop;
pLine[nCountLine].second.x = buttomx;
pLine[nCountLine].second.y = nButtom;
nCountLine++;
} int CBox::GetRange(int val){
return pRange[val];
} int CBox::Multi(POINT p1,POINT p2,POINT p0){
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
} void CBox::SetToy(POINT toy){ //利用二分查找,查找出该点在哪个区间
int l, r, mid;
l=0,r=nCountLine-1;
while (l < r){
mid = (l+r)>>1;
if (Multi(toy, pLine[mid].first, pLine[mid].second) > 0) l = mid + 1;
else r = mid;
}
if (Multi(toy, pLine[l].first, pLine[l].second) < 0) pRange[l]++;
else pRange[l+1]++;
} int main(){
int i,fx,lx;
POINT a,b;
int n,m;
while(cin>>n && n){
cin>>m>>a.x>>a.y>>b.x>>b.y;
CBox box;
box.SetBorder(a.y,a.x,b.x,b.y);
for(i = 0;i < n;i++){
cin>>fx>>lx;
box.AddLine(fx,lx);
} for(i = 0;i < m;i++){
cin>>a.x>>a.y;
box.SetToy(a);
} for(i = 0;i <= n;i++){
cout<<i<<": "<<box.GetRange(i)<<endl;
}
cout<<endl;
}
return 0;
}

  

POJ 2318 TOYS(计算几何)的更多相关文章

  1. poj 2318 TOYS&lpar;计算几何 点与线段的关系&rpar;

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12015   Accepted: 5792 Description ...

  2. POJ 2318 TOYS&lpar;计算几何&rpar;

    跨产品的利用率推断点线段向左或向右,然后你可以2分钟 代码: #include <cstdio> #include <cstring> #include <algorit ...

  3. POJ 2318 TOYS(叉积&plus;二分)

    题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...

  4. poj 2318 TOYS &lpar;二分&plus;叉积&rpar;

    http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 101 ...

  5. 简单几何&lpar;点与线段的位置&rpar; POJ 2318 TOYS &amp&semi;&amp&semi; POJ 2398 Toy Storage

    题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...

  6. POJ 2318 TOYS &amp&semi;&amp&semi; POJ 2398 Toy Storage(几何)

    2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...

  7. 向量的叉积 POJ 2318 TOYS &amp&semi; POJ 2398 Toy Storage

    POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...

  8. poj 2318 TOYS &amp&semi;amp&semi; poj 2398 Toy Storage &lpar;叉积&rpar;

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

  9. 【POJ】2318 TOYS ——计算几何&plus;二分

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10281   Accepted: 4924 Description ...

  10. 2018&period;07&period;03 POJ 2318 TOYS(二分&plus;简单计算几何)

    TOYS Time Limit: 2000MS Memory Limit: 65536K Description Calculate the number of toys that land in e ...

随机推荐

  1. 【OOAD】OOAD概述

    什么是面向对象? OOP:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.OOP 的一条基本原则是计算机程序是由单个能够起到子程序 ...

  2. ISV 和SI 是什么

    ISV是Independent Software Vendors 的英文缩写,意为"独立软件开发商",特指专门从事软件的开发.生产.销售和服务的企业,如微软(Microsoft). ...

  3. SDK命令行操作

    * 使用前需要先在path中添加Android SDK的环境变量,跟Java JDK的配置相同 我当前目录如下:F:\Program\Android SDK\tools:F:\Program\Andr ...

  4. 【SSH 基础】浅谈Hibernate关系映射(4)

    继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...

  5. NEU OJ 1644 Median I

    优先级队列 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...

  6. github隐藏文件&amp&semi;删除文件

    一.隐藏文件不提交至github 例如:需隐藏node_modules文件夹 1.找到.gitignore文件,一般这个是隐藏文件,需要显示隐藏文件 2.编辑.gitignore文件,加入下面这一句话 ...

  7. lnmp 搭建 svn服务

    服务器环境 lnmp  环境搭建地址:https://lnmp.org/install.html 注意事项  服务器必须开放3690端口 安装过程 1.yum install subversion(安 ...

  8. 查找-&gt&semi;动态查找表-&gt&semi;哈希表

    文字描述 哈希表定义 在前面讨论的各种查找算法中,都是建立在“比较”的基础上.记录的关键字和记录在结构中的相对位置不存在确定的关系,查找的效率依赖于查找过程中所进行的比较次数.而理想的情况是希望不经过 ...

  9. Docker的简单介绍及使用

    Docker介绍 Docker是Docker.Inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源. Doc ...

  10. An enumerable sequence of parameters &lpar;arrays&comma; lists&comma; etc&rpar; is not allo

    环境:dapper asp.net core 出错代码如下: public Task<IEnumerable<dynamic>> GetList(string query, p ...