杭电ACM 1174

//身高,又称身长,是指一个人从头顶到脚底的身体长度.
//杭电ACM 1174 爆头
#include<iostream>
#include<cmath>
using namespace std;
#define eps 1e-6
struct Node
{
	double x,y,z;
}line[2];
double chaji(Node&a,Node&b)//计算两个向量的叉积 
{
	double a1=a.x;
	double a2=a.y;
	double a3=a.z;
	double b1=b.x;
	double b2=b.y;
	double b3=b.z;
	double c1=a2*b3-a3*b2;
	double c2=a3*b1-a1*b3;
	double c3=a1*b2-a2*b1;
	return sqrt(c1*c1+c2*c2+c3*c3);
}
int main()
{
	double h1,r1,x1,y1,z1;//分别表示土匪的身高,头部半径以及所站的位置。
	double h2,r2,x2,y2,z2,x3,y3,z3;//h2,r2,x2,y2,z2,x3,y3,z3,
								   //分别表示警察的身高,头部半径,所站位置,以及枪头所指方向的方向向量。
	int T=0;
	cout<<"Enter T pleace: ";
	while(cin>>T)
	{
		for(int i=0;i<T;i++)
		{
			cout<<"输入土匪的身高,头部半径以及所站的位置: "<<endl;
			cin>>h1>>r1>>x1>>y1>>z1;
			cout<<"输入警察的身高,头部半径,所站位置,以及枪头所指方向的方向向量: "<<endl;
			cin>>h2>>r2>>x2>>y2>>z2>>x3>>y3>>z3;
			line[0].x=x3;
			line[0].y=y3;
			line[0].z=z3;
			line[1].x=x1-x2;
			line[1].y=y1-y2;
			line[1].z=z1+h1-r1-(z2+h2*0.9-r2);
			double d=chaji(line[0],line[1]);
			d/=sqrt(x3*x3+y3*y3+z3*z3);
			if(d-r1<eps)
				cout<<"YES"<<endl;
			else
				cout<<"NO"<<endl;
		}
	}
	return 0;
}

你可能感兴趣的:(杭电ACM 1174)