代码如下...有一点注释...
#include<cstdio>
#include<cstring>
#include<ctime>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define ld long double
#define ri register int
#define rll register long long
#define rld register long double
#define rf register float
#define rd register double
#define INF 0x7ffffff0
#define MOD 1000000007
#define MODL 1000000007L
#define rep(i,begin,end) for(int i=begin;i<end;++i)
#define all(x) x.begin(),x.end()
#define nl() putchar('\n')
inline ll read(){
rll x=0L;
ri c=getchar();
ll f=1L;
while(c<'0'||c>'9'){
if(c=='-')f=-1L;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10L+(c^48);
c=getchar();
}
return x*f;
}
#define MAXN 1100
ll T,n,h,r,mxdis2;
struct Point{
bool up,dn; //是否和上、下表面相连
ll x,y,z;
}ps[MAXN];
inline ll pow2(ll x){
return x*x;
}
inline ll dis2(Point a,Point b){
return pow2(a.x-b.x)
+pow2(a.y-b.y)
+pow2(a.z-b.z);
}
int main(){
for(T=read();T;--T){
memset(ps,0,sizeof(ps));
n=read();h=read();r=read();
//printf("n=%d h=%d r=%d\n",n,h,r);
mxdis2=pow2(r<<1); //两个洞相连的球心最大距离r²。距离都用平方算的
for(ri i=1;i<=n;++i){
ps[i].x=read();
ps[i].y=read();
ps[i].z=read();
if(ps[i].z+r>=h)ps[i].up=true;
if(ps[i].z-r<=0)ps[i].dn=true;
for(ri j=1;j<i;++j){
//printf("dist <%d,%d> = %d\n",i,j,dis2(ps[i],ps[j]));
//如果两个洞相连
if(dis2(ps[i],ps[j])<=mxdis2){
//printf("link <%d,%d>\n",i,j);
//共享上下表面相连的信息
ps[i].up|=ps[j].up;
ps[j].up|=ps[i].up;
ps[i].dn|=ps[j].dn;
ps[j].dn|=ps[i].dn;
}
}
}
//for(ri i=1;i<=n;++i)printf("(%d,%d,%d) up=%d, dn=%d\n",ps[i].x,ps[i].y,ps[i].z,ps[i].up,ps[i].dn);
bool ok=false;
for(ri i=1;i<=n;++i){
if(ps[i].dn&&ps[i].up){
ok=true;
break;
}
}
puts(ok?"Yes":"No");
}
return 0;
}