几何题。
要判断警察是否能爆头,我们只需判断匪徒头中心到子弹轨迹的距离是否小于匪徒头部半径即可。由于题中没给出直线方程,这能借助方向向量,很自然就想到了叉乘求距离。
点B到直线AC的距离 |AB X AC|/|AC| ‘X’是叉乘 ’ || ‘表示模 ;
那么这题就没什么多说的了
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double h1,r1,x1,y1,z1;
double h2,r2,x2,y2,z2,x3,y3,z3;
scanf("%lf%lf%lf%lf%lf",&h1,&r1,&x1,&y1,&z1);
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&h2,&r2,&x2,&y2,&z2,&x3,&y3,&z3);
double k1=z1+h1-r1;//匪徒的头部中点位置
double k2=z2+0.9*h2-r2;//警察头部中点位置
double a=x1-x2,b=y1-y2,c=k1-k2;//匪徒头部中点与警察头部中点的连线向量
double a1=b*z3-y3*c,b1=a*z3-x3*c,c1=a*y3-b*x3;//枪的向量与匪徒、警察的头部向量的叉乘
double dis=(a1*a1+b1*b1+c1*c1)/(x3*x3+y3*y3+z3*z3);//枪的距离与匪徒的距离的平方
if(dis<=r1*r1&&(a*x3+b*y3+c*z3>0))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}