rt,80分,WA最后两个点
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
using namespace std;
const int N=1000+55;
int t,n,h,r,m;
int x[N],y[N],z[N];
int g[N][N],vis[N];
bool check(int a,int b){
double dis=(double)( (x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])+(z[a]-z[b])*(z[a]-z[b]) );
if( (double) r*2>=sqrt(dis) ) return 1;
return 0;
}
inline void init(){
rep(i,1,n){
if(z[i]<=r) g[0][i]=g[i][0]=1;//与起点联通
if(z[i]+r>=h) g[m][i]=g[i][m]=1;//与终点联通
}
rep(i,1,n) rep(j,1,n)
if(i!=j && check(i,j) ) g[i][j]=g[j][i]=1;
}
queue<int>q;
bool bfs(){
while(!q.empty() ) q.pop();//清空队列
q.push(0);
vis[0]=1;
while(!q.empty()){
int v=q.front();
q.pop() ;
rep(i,0,m)
if(g[v][i]&&!vis[i]){
if(i==m) return 1;
vis[i]=1;
q.push(i);
}
}
return 0;
}
int main(){
cin>>t;
while(t--){
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
cin>>n>>h>>r;
m=n+1;//虚拟终点,编号为m
rep(i,1,n) cin>>x[i]>>y[i]>>z[i];
init();//初始化
if(bfs()) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}