计算几何,不过题意有点模糊,因此貌似数据也比较水
#include <stdio.h> #include <vector> #include <string.h> #include <math.h> using namespace std; #define MAXN 35 const double eps = 1e-6; int cmpZero ( double a ) { return ( a > eps ) - ( a < -eps ); } struct mPt { double x, y, z; mPt ( double a = 0.0, double b = 0.0, double c = 0.0 ) : x ( a ), y ( b ), z ( c ) {} mPt operator - ( const mPt & a ) const { return mPt ( x - a.x, y - a.y, z - a.z ); } mPt operator ^ ( const mPt & b ) const /// 叉乘 { return mPt ( y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x ); } double operator * ( const mPt & a ) const /// 点乘 { return x * a.x + y * a.y + z * a.z; } double getVal() { return sqrt ( x * x + y * y + z * z ); } void input() { scanf ( "%lf%lf%lf", &x, &y, &z ); } }; /// 计算两个异面直线间距离 double getDis_LL ( mPt a, mPt va, mPt b, mPt vb ) { mPt c = va ^ vb; return fabs ( c * ( a - b ) ) / c.getVal(); } double getDis_ULL ( mPt a, mPt b, mPt v ) { mPt c = ( b - a ) ^ v; return fabs ( c.getVal() / v.getVal() ); } struct _node { mPt ct, p1, p2; double r; void input() { ct.input(); p1.input(); p2.input(); r = ( p1 - ct ).getVal(); } mPt getV() { return ( p1 - ct ) ^ ( p2 - ct ); } } node[MAXN]; int isEqual ( mPt v1, mPt v2 ) { mPt a = v1 ^ v2; double b = a.getVal(); return cmpZero ( b ) == 0; } int main() { #ifdef __GNUC__ freopen ( "in.txt", "r", stdin ); //freopen ( "out.txt", "w", stdout ); #endif // __GNUC__ int t, n; scanf ( "%d", &t ); while ( t-- ) { scanf ( "%d", &n ); for ( int i = 0; i < n; ++i ) { node[i].input(); } double mn = 1e20; for ( int i = 0; i < n; ++i ) { for ( int j = i + 1; j < n; ++j ) { mPt v1 = node[i].getV(); mPt v2 = node[j].getV(); if ( isEqual ( v1, v2 ) ) { double p = getDis_ULL ( node[i].ct, node[j].ct, v1 ); if ( cmpZero ( p ) == 0 ) { if ( cmpZero ( node[i].r - node[j].r ) == 0 ) { printf ( "Lucky\n" ); goto cao; } else { mn = min ( mn, fabs ( node[i].r - node[j].r ) ); } } else { if ( p > fabs ( node[i].r - node[j].r ) && p < fabs ( node[i].r + node[j].r ) ) { printf ( "Lucky\n" ); goto cao; } else if ( p > fabs ( node[i].r + node[j].r ) ) { mn = min ( mn, p - node[i].r - node[j].r ); } else { mn = min ( mn, fabs ( node[i].r - node[j].r ) - p ); } } } else { double p = getDis_LL ( node[i].ct, v1, node[j].ct, v2 ); p -= ( node[i].r + node[j].r ); if ( cmpZero ( p ) <= 0 ) { printf ( "Lucky\n" ); goto cao; } else { mn = min ( mn, p ); } } } } printf ( "%.2lf\n", mn ); cao: ; } return 0; }
hdu 4617 Weapon
最新推荐文章于 2015-02-05 11:04:49 发布