代码:
#include<bits/stdc++.h>
using namespace std;
int t;
struct shape{
double x,y,z;
bool flag;
}a[1000005];
int f[1000005];
double dist(int p1,int p2){
return sqrt((a[p1].x-a[p2].x)*(a[p1].x-a[p2].x)+(a[p1].y-a[p2].y)*(a[p1].y-a[p2].y)+(a[p1].z-a[p2].z)*(a[p1].z-a[p2].z))*1.0000000;
}
int find(int x){
if(x==f[x]) return x;
return f[x]=find(f[x]);
}
signed main(){
cin>>t;
while(t--){
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
double n,h,r;
cin>>n>>h>>r;
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
if(a[i].z<=r&&a[i].z>=0-r) a[i].flag=1; //这里判断这个洞是否与下表面相交或相切
for(int j=1;j<i;j++){
double num=dist(i,j);
if(num<=2*r){
int x=find(i);
int y=find(j);
if(a[i].z>=a[j].z) f[y]=x;
else f[x]=y;
}
}
}
bool ans=0;
for(int i=1;i<=n;i++){
if(a[i].flag){
if(a[find(f[i])].z>=h-r){
cout<<"Yes\n";
ans=1;
break;
}
}
}
if(ans==0) cout<<"No\n";
}
return 0;
}