POJ 2318 - TOYS (计算几何)

POJ 2318- TOYS

一个比较适合入门的基础题

题目

Calculate the number of toys that land in each bin of a partitioned toy box.
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the toys get mixed up, and it is impossible for John to find his favorite toys.

John’s parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example toy box.
在这里插入图片描述

For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box


Input

The input file contains one or more problems. The first line of a problem consists of six integers, n m x1 y1 x2 y2. The number of cardboard partitions is n (0 < n <= 5000) and the number of toys is m (0 < m <= 5000). The coordinates of the upper-left corner and the lower-right corner of the box are (x1,y1) and (x2,y2), respectively. The following n lines contain two integers per line, Ui Li, indicating that the ends of the i-th cardboard partition is at the coordinates (Ui,y1) and (Li,y2). You may assume that the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right. The next m lines contain two integers per line, Xj Yj specifying where the j-th toy has landed in the box. The order of the toy locations is random. You may assume that no toy will land exactly on a cardboard partition or outside the boundary of the box. The input is terminated by a line consisting of a single 0.


output

The output for each problem will be one line for each separate bin in the toy box. For each bin, print its bin number, followed by a colon and one space, followed by the number of toys thrown into that bin. Bins are numbered from 0 (the leftmost bin) to n (the rightmost bin). Separate the output of different problems by a single blank line

Sample Input

5 6 0 10 60 0
3 1
4 3
6 8
10 10
15 30
1 5
2 1
2 8
5 5
40 10
7 9
4 10 0 10 100 0
20 20
40 40
60 60
80 80
 5 10
15 10
25 10
35 10
45 10
55 10
65 10
75 10
85 10
95 10
0

Sample Output

0: 2
1: 1
2: 1
3: 1
4: 0
5: 1

0: 2
1: 2
2: 2
3: 2
4: 2

题目大意:

n条线段将一个矩形分成n+1块,计算每一个块内有几个点。

题目分析:

这个就是一计算几何的模板题,我们首先要明白,向量的叉乘可以用来判断点在这个线的左边还是右边,这样我们就可以利用点,和这个线的单位向量来判断这个玩具在哪个盒子里了,具体看代码,又解释。

在这里插入图片描述

AC代码

#include<iostream>
#include<cmath>
#include<string.h>
#include<stdio.h>
int n,m,x1,y3,x2,y2,u,v;
struct point{
	double x,y;
	point(){}
	point(double a,double b){x=a,y=b;}
};//定义一个点的结构体
struct Line{
	point star,ve;
	
}L[5005];//题目数据不超过5000,这是用来存放线的结构体数组

int ans[5005];//存放答案
int cj(point a,point b) { return a.x*b.y-a.y*b.x; }//这个是向量的叉乘,

int main(){
	//多组数据输入输出
	while(scanf("%d%d%d%d%d%d",&n,&m,&x1,&y3,&x2,&y2)!=EOF){
		if (n == 0) break;
        memset(ans,0,sizeof(ans));
		
	for(int i=1;i<=n;i++){
		scanf("%d%d",&u,&v);
		L[i].star=point(v,y2);
		L[i].ve=point(u-v,y3-y2);
	}//储存号线的起点和单位向量。
	for(int i=1;i<=m;i++){
		scanf("%d%d",&u,&v);//得到玩具的坐标
		int l=1,r=n+1;
		//定义的是线的左边是前一个盒子,二分法来确定位置
 		while(l<r){
			int mid = (l+r)/2;
			point p(u-L[mid].star.x,v-L[mid].star.y);
			//玩具的坐标和线的起点构成另一个向量。
			//如果p 和直线的单位向量的叉积大于0,那么线在点的左边
			//这里如果不理解,看上面图
			if(cj(p,L[mid].ve)>0)
				l = mid+1;// 这加一防止死循环,并且l-1正好是盒子序号
			else
				r=mid;
		}
		ans[l-1]++;
	}
	
	
	for (int i=0; i<=n; i++)//注意 画了n条线,有n+1个格子,

	printf("%d: %d\n",i,ans[i]);
        
	printf("\n");	//记得输出一个换行
	}
	return 0;	
}

 

我来要赞了,如果觉得解释还算详细,可以学到点什么的话,点个赞再走吧
欢迎各位路过的dalao 指点,提出问题。

发布了50 篇原创文章 · 获赞 50 · 访问量 2732

猜你喜欢

转载自blog.csdn.net/weixin_45691686/article/details/104818026