Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s): 1447 Accepted
Submission(s): 601
1 struct Vector3{ //方向向量
2 double x,y,z;
3 };
4 double xmulti3(Vector3 v1,Vector3 v2) //三维向量的叉积
5 {
6 double x1 = v1.x;
7 double y1 = v1.y;
8 double z1 = v1.z;
9 double x2 = v2.x;
10 double y2 = v2.y;
11 double z2 = v2.z;
12 double x = y1*z2 - z1*y2;
13 double y = z1*x2 - x1*z2;
14 double z = x1*y2 - y1*x2;
15 return sqrt(x*x+y*y+z*z);
16 }
参考链接:
ACM HDU 1174 爆头(数学题,求空间点到直线的距离,用叉积)
http://blog.sina.com.cn/s/blog_70743a560100lneu.html
本题代码:
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4 struct Vector3{ //方向向量
5 double x,y,z;
6 };
7 double xmulti3(Vector3 v1,Vector3 v2) //三维向量的叉积
8 {
9 double x1 = v1.x;
10 double y1 = v1.y;
11 double z1 = v1.z;
12 double x2 = v2.x;
13 double y2 = v2.y;
14 double z2 = v2.z;
15 double x = y1*z2 - z1*y2;
16 double y = z1*x2 - x1*z2;
17 double z = x1*y2 - y1*x2;
18 return sqrt(x*x+y*y+z*z);
19 }
20 int main()
21 {
22 double h1,r1,x1,y1,z1;
23 double h2,r2,x2,y2,z2,x3,y3,z3;
24 int T;
25 cin>>T;
26 while(T--){
27 cin>>h1>>r1>>x1>>y1>>z1;
28 cin>>h2>>r2>>x2>>y2>>z2>>x3>>y3>>z3;
29 Vector3 v1,v2;
30 //确定警头心到匪头心的射线
31 v1.x = x1 - x2;
32 v1.y = y1 - y2;
33 v1.z = z1 + h1 -r1 - ( h2*0.9 + z2 -r2);
34 //确定子弹射线
35 v2.x = x3;
36 v2.y = y3;
37 v2.z = z3;
38 //求匪的头心到射线的距离
39 double dis = fabs(xmulti3(v1,v2))/sqrt(x3*x3+y3*y3+z3*z3);
40 //判断能否爆头
41 if(dis <= r1)
42 cout<<"YES"<<endl;
43 else
44 cout<<"NO"<<endl;
45 }
46 return 0;
47 }
Freecode : www.cnblogs.com/yym2013
原文:http://www.cnblogs.com/yym2013/p/3542632.html