PKU 3129

给定N颗星星和M个望眼镜,问望眼镜能看见的星星的颗数(其实就是就给定的星星与望眼镜的夹角是否小于给出的望眼镜的夹角)

/*
poj 3219 
result:ac
time:47MS
*/
#include"stdio.h"
#include"string.h"
#include"math.h"
struct point
{
	double x,y,z;
}p[510];
int use[510];
double ACOS(point a,point b)//计算两点夹角
{
	double s1,s2,s3,d;
	s1=a.x*a.x+a.y*a.y+a.z*a.z;
	s2=b.x*b.x+b.y*b.y+b.z*b.z;
	s3=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
	d=(s1+s2-s3)/2/sqrt(s1)/sqrt(s2);//余弦定理,其中s1,s2,s3分别是各边的平方。
	d=acos(d);
	return d;
}
int main()
{
	int n,m,i,j,total;
	double r,b;
	while(scanf("%d",&n),n)
	{
		total=0;
		for(i=1;i<=n;i++)
			scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
		for(i=1;i<=n;i++)
			use[i]=0;
		scanf("%d",&m);
		for(i=1;i<=m;i++)
		{
			scanf("%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[0].z,&r);
			for(j=1;j<=n;j++)
			{
				if(use[j])
					continue;
				b=ACOS(p[0],p[j]);
				if(r-b>1e-8)
				{
					use[j]=1;
					total++;
				}
			}
		}
		printf("%d\n",total);
	}
	return 0;
}
posted @ 2011-07-16 01:21  Ac_smile  阅读(161)  评论(0编辑  收藏  举报