【题目大意】:判断一个长方体与一个球体是否接触
【解题思路】:接触的话也即存在一个点(x,y)成立:r*r>=(x-cx)*(x-cx)+(y-cy)*(y-cy)+(z-cz)*(z-cz)
只要要找到这个离球心最近的点,就可以了。
分开对待各维(它们互不相关),
x=cx;
if(x>maxx)x=maxx;
if(x<minx)x=minx;
这样的x就是长方体内离cx最近的点的x坐标了,其他的同理
【代码】:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int T;
int main(){
scanf("%d",&T);
int x,y,z,cx,cy,cz,r;
int minx,maxx,miny,maxy,minz,maxz;
while (T--){
scanf("%d%d%d",&x,&y,&z);
minx=maxx=x;
miny=maxy=y;
minz=maxz=z;
for (int i=1; i<8; i++){
scanf("%d%d%d",&x,&y,&z);
minx=min(minx,x);
maxx=max(maxx,x);
miny=min(miny,y);
maxy=max(maxy,y);
minz=min(minz,z);
maxz=max(maxz,z);
}
scanf("%d%d%d%d",&cx,&cy,&cz,&r);
x=cx;
y=cy;
z=cz;
if (x>maxx) x=maxx;
if (x<minx) x=minx;
if (y>maxy) y=maxy;
if (y<miny) y=miny;
if (z>maxz) z=maxz;
if (z<minz) z=minz;
if ((long long)r*r>=(long long)(x-cx)*(x-cx)+(long long)(y-cy)*(y-cy)+(long long)(z-cz)*(z-cz)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}