1566: 碰撞检测 contest 4
1566: 碰撞检测
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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) 编辑 收藏 举报