// UVa10794 The Deadly Olympic Returns // 陈锋 #include #include #include #include #include #include using namespace std; typedef long long int64; struct Point3 { int64 x, y, z; Point3(int64 x=0, int64 y=0, int64 z=0):x(x),y(y),z(z) { } }; typedef Point3 Vector3; Vector3 operator + (const Vector3& A, const Vector3& B) { return Vector3(A.x+B.x, A.y+B.y, A.z+B.z); } Vector3 operator - (const Point3& A, const Point3& B) { return Vector3(A.x-B.x, A.y-B.y, A.z-B.z); } int64 Dot(const Vector3& A, const Vector3& B) { return A.x*B.x + A.y*B.y + A.z*B.z; } Vector3 Cross(Vector3 A, Vector3 B) { return Vector3(A.y*B.z - A.z*B.y, A.z*B.x - A.x*B.z, A.x*B.y - A.y*B.x); } int64 readint64() { int64 x; scanf("%lld", &x); return x; } Point3 read_point3() { Point3 p; p.x = readint64(); p.y = readint64(); p.z = readint64(); return p; } /********************************************************************/ void solve(int64 c) { printf("Case %d: ", c); readint64(); Point3 src1 = read_point3(), dest1 = read_point3(); Point3 src2 = read_point3(), dest2 = read_point3(); Vector3 v = (dest2 - src2) - (dest1 - src1); // 2相对于1的速度 // 求点 src1 到射线 src2, v最短距离 double ans; Vector3 ss = src1 - src2; if(Dot(v, v) == 0 || Dot(ss, v) <= 0) ans = sqrt(Dot(ss, ss)); else { Vector3 c = Cross(v, ss); ans = Dot(c, c); ans /= Dot(v, v); ans = sqrt(ans); } printf("%.4f\n", ans); } int main() { int64 T = readint64(); for(int64 i = 1; i <= T; i++) solve(i); return 0; }