1566: 碰撞检测 contest 4

1566: 碰撞检测

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 52  Solved: 11
[Submit][Status][Web Board]

Description

小毛在做计算几何题时,遇到一个问题:在3D空间里有一个球体和一个长方体,判断它们是否会发生碰撞(collision)。小毛想了半天都没想出来,只有靠你去解决它了。

Input

第一行一个整数T,表示案例数。
每个案例两行,
第一行24个整数,分别为X1,Y1,Z1,X2,Y2,Z2...X8,Y8,Z8,表示一个长方体的8个顶点的空间位置,(注意:输入保证每个长方体的各边平行于坐标轴)。
第二行4个整数,分别为X,Y,Z,R,表示一个球体的球心位置和半径长度。

Output

每个案例输出一行,若发生碰撞,输出“Yes”,否则输出“No”。

Sample Input

1 10 20 20 10 20 10 20 20 10 20 20 20 20 10 20 10 10 20 10 10 10 20 10 10 0 0 0 10000

Sample Output

Yes

#include<iostream>
#include
<cmath>
#include
<cstring>
#include
<cstdlib>
#include
<algorithm>
#include
<stdio.h>
using namespace std;

long long cmp( long long low, long long high, long long p)
{
if (p < low ) return low - p;
if (p > high ) return p - high;
return 0;
}

long long c[30];

int main( )
{
int T, a, b;
long long i;
long long r, x, y, z;
long long x1,y1,z1;
scanf(
"%d",&T);
while (T--)
{
for ( i = 0; i < 24; i++)
scanf(
"%lld",&c[i]);
a
= 2;
for (i = 5; i < 24; i += 3) {
if( c[i] != c[2] && c[i-2]!= c[0] && c[i-1] != c[1] )
b
= i;
}
if ( c[a] < c[b] )
swap( c[a],c[b] );
if ( c[a - 1] < c[b - 1])
swap( c[a
-1],c[b-1]);
if ( c[a-2] < c[b -2] )
swap( c[a
- 2],c[b -2] );
scanf(
"%lld%lld%lld%lld",&x,&y,&z,&r);
x1
= cmp(c[b-2] , c[a-2], x);
y1
= cmp(c[b-1] , c[a-1], y);
z1
= cmp(c[b], c[a], z);
if ( x1* x1 + y1 * y1 + z1 * z1 <= r * r)
printf(
"Yes\n");
else
printf(
"No\n");
}
return 0;
}

posted on 2011-08-04 11:04  more think, more gains  阅读(199)  评论(0编辑  收藏  举报

导航