思路是先建图再在图上bfs,50分,WA
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <bits/stdc++.h>
#define mp(a,b) make_pair(a,b)
#define ll long long
using namespace std;
const int N=1e3+10;
struct Jerry{
int x,y,z;
}a[N];
int n,h,r;
bool up[N],vis[N];
vector<int> down,vc[N];
queue<int> q;
ll Len(int u,int v)
{
ll x,y,z;
x=a[u].x-a[v].x;x*=x;
y=a[u].y-a[v].y;y*=y;
z=a[u].z-a[v].z;z*=z;
return x+y+z;
}
//距离^2
bool checkLen(int u,int v)
{
return Len(u,v)<=4ll*r*r;
}
//能到return 1
void bfs()
{
for(auto it:down) q.push(it),vis[it]=1;
int head;
while(!q.empty())
{
head=q.front();
q.pop();
if(up[head])
{
printf("Yes\n");
return;
}
for(auto it:vc[head])
{
if(!vis[it])
{
vis[it]=1;
q.push(it);
}
}
}
printf("No\n");
}
void solve()
{
down.clear();
for(int i=0;i<N;i++) vc[i].clear();
memset(up,0,sizeof(up));
memset(vis,0,sizeof(0));
while(!q.empty()) q.pop();
//初始化
scanf("%d%d%d",&n,&h,&r);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
for(int j=1;j<n;j++)
if(checkLen(i,j))
{
vc[i].push_back(j);
vc[j].push_back(i);
}
if(a[i].z-r<=0) down.push_back(i);
if(a[i].z+r>=h) up[i]=1;
}
// cout<<"VC"<<endl;
// for(int i=1;i<=n;i++)
// {
// for(auto it:vc[i]) cout<<it<<' ';
// cout<<endl;
// }
//
// cout<<"UP"<<endl;
// for(int i=1;i<=n;i++) cout<<up[i]<<' ';
// cout<<endl;
//
// cout<<"DOWN"<<endl;
// for(auto it:down) cout<<it<<' ';
// cout<<endl;
bfs();
}
int main()
{
int T;
cin>>T;
while(T--) solve();
return 0;
}