```cpp
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=1007;
struct Node{
int x,y,z;
}node[maxn];
int t,n,h,r;
int vis[maxn]={0};
bool flag;
bool dOk(Node a,Node b){
double dis=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
double mandis=2*double(r);
if(dis>mandis)return false;
return true;
}
bool cmp(Node a,Node b){
return a.z<b.z;
}
void dfs(int id){
//cout<<"1";
if(node[id].z+r>=h){//到达上表面
flag=true;
return;
}
vis[id]=1;
for(int k=0;k<n;k++){
if(flag)return;//无可厚非
if(vis[k])continue;
if(!dOk(node[k],node[id]))continue;
// cout<<"去"<<k<<"\n";
dfs(k);
//恢复
//vis[k]=0;
}
}
int main(){
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
memset(node,0,sizeof(node));
cin>>n>>h>>r;
for(int i=0;i<n;i++){
//cin>>node[i].x>>node[i].y>>node[i].z;
scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].z);
}
sort(node,node+n,cmp);
flag=false;
for(int i=0;i<n;i++){
if(node[i].z-r>0)continue;//不在下表面,不是起点
dfs(i);
}
if(flag){
printf("Yes\n");
}
if(!flag)printf("No\n");
}
return 0;
}
求教