POJ 2318 TOYS(点与直线的位置关系)

题:

一个矩形区域中有n条互不相交的线段,每条线段的上下端点分别在矩形的上下边上,现给出该矩形区域中m个点的坐标,保证点不在边上,统计由这n条边将矩形分成的n+1个区域中各有多少个点。

输入:

多组用例,每组用例第一行六个整数n,m,xl,yl,xr,yr分别表示边数,点数,矩形区域左上角的横纵坐标(xl,yl),矩形区域右下角的横纵坐标(xr,yr),之后n行每行两个整数x1和x2表示该条边上下端点的横坐标,最后m行每行两个数x和y表示该点坐标。

输出:每个区域包含的点数

Sample Output
0: 2
1: 1
2: 1
3: 1
4: 0
5: 1

思路:

每输入一个点,判断这个点在哪些边的右边,找到最后一条边,该点就在这个区域内(因为区域是从0开始编号)。

代码:

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

using namespace std;

const int N=5010;

struct node{
	int x1,y1,x2,y2;//x1,y1上端点,x2,y2下端点 
}p[N];

//判断某点是否在某边的右侧

bool is_right(int x,int y,int a) //a是边的下标 
{
	int x1=p[a].x1;
	int y1=p[a].y1;
	int x2=p[a].x2;
	int y2=p[a].y2;
	
	int ans=((x1-x)*(y2-y)-(y1-y)*(x2-x));
	
	return ans>0?true:false; 
	
 } 
 
int main()
{
	int n,m,xl,yl,xr,yr;
	int res=1;
	while(scanf("%d",&n),n)
	{
		scanf("%d%d%d%d%d",&m,&xl,&yl,&xr,&yr);
		if(res!=1)
			printf("\n");
			
		for(int i=1;i<=n;i++)
			scanf("%d%d",&p[i].x1,&p[i].x2);
			
		//将区间加入边集
		p[0].x1=xl;
		p[0].x2=xl;
		p[n+1].x1=xr;
		p[n+1].x2=xr;
		
		 
		for(int i=0;i<=n+1;i++)
		{
			p[i].y1=yl;
			p[i].y2=yr;
		}
		
		int cnt[N]={0};
		
		while(m--)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			int temp=0;
			while(is_right(x,y,temp++)) ;//找到在该点左侧边的最右边一条边
			 
			 temp-=2;
			 cnt[temp]++;
		}
		
		for(int i=0;i<=n;i++)
			printf("%d:%d\n",i,cnt[i]);
		res++;
	
	}
	
	return 0;
}

题目链接:

POJ2318

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值