1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <iostream> 5 #include <cmath> 6 using namespace std; 7 typedef long long LL; 8 9 const double EPS = 1e-8; 10 const double INF = 1e50; 11 const double PI = acos(-1.0); 12 13 inline int sgn(double x) { 14 return (x > EPS) - (x < EPS); 15 } 16 17 struct Point3D { 18 double x, y, z; 19 Point3D() {} 20 Point3D(double x, double y, double z): x(x), y(y), z(z) {} 21 void read() { 22 scanf("%lf%lf%lf", &x, &y, &z); 23 } 24 double operator * (const Point3D &rhs) const { 25 return x * rhs.x + y * rhs.y + z * rhs.z; 26 } 27 Point3D operator + (const Point3D &rhs) const { 28 return Point3D(x + rhs.x, y + rhs.y, z + rhs.z); 29 } 30 Point3D operator - (const Point3D &rhs) const { 31 return Point3D(x - rhs.x, y - rhs.y, z - rhs.z); 32 } 33 double length() const { 34 return sqrt(x * x + y * y + z * z); 35 } 36 }; 37 38 struct Line3D { 39 Point3D st, ed; 40 Line3D() {} 41 Line3D(Point3D st, Point3D ed): st(st), ed(ed) {} 42 }; 43 44 struct Plane3D { 45 Point3D a, b, c; 46 Plane3D() {} 47 Plane3D(Point3D a, Point3D b, Point3D c): a(a), b(b), c(c) {} 48 void read() { 49 a.read(), b.read(), c.read(); 50 } 51 }; 52 53 double dist(const Point3D &a, const Point3D &b) { 54 return (a - b).length(); 55 } 56 //叉积 57 Point3D cross(const Point3D &u, const Point3D &v) { 58 Point3D ret; 59 ret.x = u.y * v.z - u.z * v.y; 60 ret.y = u.z * v.x - u.x * v.z; 61 ret.z = u.x * v.y - u.y * v.x; 62 return ret; 63 } 64 //点到直线距离 65 double point_to_line(const Point3D &p, const Line3D &l) { 66 return cross(p - l.st, l.ed - l.st).length() / dist(l.ed, l.st); 67 } 68 //求两直线间的距离 69 double line_to_line(const Line3D u, const Line3D v) { 70 Point3D n = cross(u.ed - u.st, v.ed - v.st); 71 return fabs((u.st - v.st) * n) / n.length(); 72 } 73 //取平面法向量 74 Point3D vector_of_plane(const Plane3D &s) { 75 return cross(s.a - s.b, s.b - s.c); 76 } 77 //判断两直线是否平行 78 bool isParallel(const Line3D &u, const Line3D &v) { 79 return sgn(cross(u.ed - u.st, v.ed - v.st).length()) <= 0; 80 } 81 82 const int MAXN = 35; 83 84 Plane3D s[MAXN]; 85 Line3D l[MAXN]; 86 double r[MAXN]; 87 int T, n; 88 89 int main() { 90 scanf("%d", &T); 91 while(T--) { 92 scanf("%d", &n); 93 for(int i = 0; i < n; ++i) s[i].read(); 94 for(int i = 0; i < n; ++i) { 95 Point3D v = vector_of_plane(s[i]); 96 l[i] = Line3D(s[i].a, s[i].a + v); 97 r[i] = dist(s[i].a, s[i].b); 98 } 99 double ans = INF; 100 for(int i = 0; i < n; ++i) { 101 for(int j = i + 1; j < n; ++j) { 102 double d; 103 if(isParallel(l[i], l[j])) d = point_to_line(l[i].st, l[j]); 104 else d = line_to_line(l[i], l[j]); 105 ans = min(ans, d - r[i] - r[j]); 106 } 107 } 108 if(sgn(ans) <= 0) puts("Lucky"); 109 else printf("%.2f\n", ans); 110 } 111 }