现在的位置: 首页 > 综合 > 正文

POJ 2318 toys 叉积的简单运用

2013年03月25日 ⁄ 综合 ⁄ 共 993字 ⁄ 字号 评论关闭

题目大意:有一个盒子,n块挡板把盒子分成n+1部分,m个玩具给出坐标,判断盒子中每个部分各有多少个玩具。

我的思路:直接枚举每个玩具在各个区域的情况,利用叉积判断,若叉积大于0则在该侧。(也可以用二分优化)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define eps 1e-10

int dcmp(double x)
{
    if(fabs(x)<eps)//x==0
       return 0;
    else
       return x<0?-1:1;
}

struct point
{
    int x,y;
};
struct point dot[5000+10];//每个挡板的向量
struct point play[5000+10];//玩具的向量

double cross(double x1,double y1,double x2,double y2)//叉积
{
    return x1*y2-x2*y1;
}

int main()
{
    int n,m,i,j,k;
    int a[5000+10],b[5000+10];//挡板坐标
    int x1,y1,x2,y2;//盒子坐标
    int xx,yy;//玩具坐标
    while(scanf("%d%d",&n,&m)&&n!=0)//n个挡板,m个玩具
    {
        double temp;
        int ans[5000+10]={0};//最后结果
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//盒子坐标
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&a[i],&b[i]);
            dot[i].x=a[i]-b[i],dot[i].y=y1-y2;//挡板向量
        }
        int sum=0;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&xx,&yy);//每个玩具的坐标
            for(j=1;j<=n;j++)//第几个挡板
            {
                play[i].x=xx-b[j],play[i].y=yy-y2;//玩具向量
                temp=cross(play[i].x,play[i].y,dot[j].x,dot[j].y);
                if(dcmp(temp)==-1)
                {
                    ans[j-1]++;
                    sum++;
                    break;
                }
            }
        }
        ans[n]=m-sum;
        for(i=0;i<=n;i++)
        printf("%d: %d\n",i,ans[i]);
        printf("\n");//注意格式
    }
    return 0;
}

抱歉!评论已关闭.