hdu 2318 TOYS

给出一个矩形范围,给出n条线段,这n条线段一定与矩形上下边界相交且互不相交,将矩形分成n+1个划分。给出m个玩具的坐标。求每个划分放的玩具数,玩具保证不会在线段和左右边界上。

分析:

判断点是否在两条直线中间,利用叉积,如果在两条直线间,必定会有两个叉积一个小于0,一个大于0(不能把相乘小于0作为判断条件)

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
struct Dian
{
    int x,y;
};
struct Line
{
    Dian a,b;
}line[5001];
int n,m,total[5001];

// 求叉积p0p1 叉乘 p0p2 大于0 说明p1在 p0p2的左侧 
int chaji(Dian p0,Dian p1,Dian p2)
{
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

void judge(Dian d)
{
    int i;
    // 从第一条线向后遍历,如果点在该线左面,则该下标total++
    for(i=0;i<n;++i)
    {
    	//
		if(chaji(line[i].a,d,line[i].b)<0)  continue;
        else  
		{
			++total[i];
			return;
		}
    }
    // 找到最后都没找到,就是在最后一个区域
    ++total[n];
    return;
}
int main(){
	freopen("in.txt","r",stdin);
  
    Dian left_up,right_low,temp;
	int x1,x2,y1,y2;
	int i;
    while(cin>>n && n)
    {
        cin>>m>>left_up.x>>left_up.y>>right_low.x>>right_low.y;
        memset(total,0,sizeof(total));
	  	
		 for(i=0;i<n;++i)
        {
            cin>>line[i].a.x>>line[i].b.x;
            line[i].a.y=left_up.y;
            line[i].b.y=right_low.y;
        }
        for(i=0;i<m;++i)
        {
            cin>>temp.x>>temp.y;
            judge(temp);
        }

        // 输出格式
        for(i=0;i<=n;++i)
            cout<<i<<": "<<total[i]<<endl;
        cout<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值