就是求圆柱体之间距离的最小值,枚举即可。。
向量叉乘求平面法向量,然后求距离。。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
typedef __int64 lld;
const int MAXN = 40;
const int inf= 0x7f7f7f7f;
typedef struct
{
double x,y,z;
double r;
double i,j,k;
}pp;
pp wp[MAXN];
double a1,a2,b1,b2,c1,c2;
void init(pp &a)
{
a.i=(b1-a.y)*(c2-a.z)-(b2-a.y)*(c1-a.z);
a.j=(c1-a.z)*(a2-a.x)-(a1-a.x)*(c2-a.z);
a.k=(a1-a.x)*(b2-a.y)-(a2-a.x)*(b1-a.y);
a.r=sqrt((a1-a.x)*(a1-a.x)+(b1-a.y)*(b1-a.y)+(c1-a.z)*(c1-a.z));
}
double cal(pp a,pp b)
{
a1=a.j*b.k-b.j*a.k;
b1=a.k*b.i-a.i*b.k;
c1=a.i*b.j-b.i*a.j;
a2=a.x-b.x;b2=a.y-b.y;c2=a.z-b.z;
double d=(a1*a2+b1*b2+c1*c2);
return fabs(d)/sqrt(a1*a1+b1*b1+c1*c1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf",&wp[i].x,&wp[i].y,&wp[i].z);
scanf("%lf%lf%lf",&a1,&b1,&c1);
scanf("%lf%lf%lf",&a2,&b2,&c2);
init(wp[i]);
}
double ans=inf;
int flag=1;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
double d=cal(wp[i],wp[j]);
if(d<=wp[i].r+wp[j].r)
{
flag=0;
break;
}
else
{
ans=min(ans,d-(wp[i].r+wp[j].r));
}
}
if(!flag) break;
}
if(flag) printf("%.2lf\n",ans);
else puts("Lucky");
}
}