题:
一个矩形区域中有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;
}
题目链接: