http://acm.hdu.edu.cn/showproblem.php?pid=1140

根据球的切点做简单的判断,一开始找到答案没有跳出循环,各种错。。。

View Code
#include <iostream>
#include <cmath>
using namespace std ;
const double PI=acos(-1.0) ;//π的表示方法 
struct point 
{
    double x,y,z ;
} ;
double dis(point p1,point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z)) ;
}
int main()
{
    int k,m ;
    while(scanf("%d%d",&k,&m),(k||m))
    {
        point O ;
        O.x=O.y=O.z=0 ;
        point p[101] ;
        for(int i=0;i<k;i++)
            scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z) ;
        double r=20000.0/PI ;
        int ans=0 ;
        while(m--)
        {
            point target ;
            scanf("%lf%lf%lf",&target.x,&target.y,&target.z) ;
            for(int i=0;i<k;i++)
                if(dis(p[i],O)*dis(p[i],O)>=r*r+dis(p[i],target)*dis(p[i],target))
                { 
                    ans++ ;
                    break ;
                }
        }
        printf("%d\n",ans) ;
    }
    return 0 ;
}