您的位置:首页 > 其它

POJ 2398 Toy Storage(叉积的简单应用)

2013-08-09 10:41 239 查看
题意:有一个盒子,里面有n块隔板将其分为n+1个部分(挡板坐标已给出),现在给出m个球的坐标,让你判断每个分割出的部分里面有多少个小球。

思路:利用叉积判断每个挡板是在球的左侧还是右侧(叉积>0在左侧,叉积<0在右侧),直接枚举即可。(数据很水,其实二分会更快一点,但是由于是很久以前的代码也就不想改了)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define eps 1e-10
#define maxn 100000+10

struct point
{
int x,y;
};
struct point shelter[maxn];//挡板向量
struct point toy[maxn];//玩具向量

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

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

int main()
{
int n,m,x1,y1,x2,y2,i,j,k;
int a[maxn],b[maxn];//挡板坐标
int xx,yy;//输入的玩具坐标
while(scanf("%d%d",&n,&m)&&n!=0)
{
int count=0;
double temp;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//盒子坐标
int ans[maxn]={0};//最后的结果
int result[maxn]={0};//保存每个盒子中的数量
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);//挡板
shelter[i].x=a[i]-b[i],shelter[i].y=y1-y2;//挡板向量
}
//对挡板坐标排序(很蛋疼的用了个冒泡)
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
{
int ch;
double sh;
if(a[i]>a[j])//升序
{
ch=a[i],a[i]=a[j],a[j]=ch;
ch=b[i],b[i]=b[j],b[j]=ch;
sh=shelter[i].x,shelter[i].x=shelter[j].x,shelter[j].x=sh;
sh=shelter[i].y,shelter[i].y=shelter[j].y,shelter[j].y=sh;
}
}
int sum=0;
for(i=1;i<=m;i++)//枚举每个玩具
{
scanf("%d%d",&xx,&yy);//每个玩具的坐标
for(j=1;j<=n;j++)//枚举每个挡板直到第一个出现在小球右侧的挡板
{
toy[i].x=xx-b[j],toy[i].y=yy-y2;//玩具向量
temp=cross(toy[i].x,toy[i].y,shelter[j].x,shelter[j].y);
if(dcmp(temp)==-1)
{
ans[j-1]++;
sum++;
break;
}
}
}
ans
=m-sum;
for(i=0;i<=n;i++)
if(ans[i])
result[ans[i]]++;

printf("Box\n");
for(i=0;i<n;i++)
if(result[i])
printf("%d: %d\n",i,result[i]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: