我的做法和我下面的帖子一样。
//P3958 [NOIP2017 提高组] 奶酪
#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
int n,h,r;
const int N=1005;
struct node
{
ll x,y,z;
}p[1005];
vector<int>to[N];
bool nl[N];//与上表面相交
bool ml[N];//与下表面相交
bool vis[N],flag;
ll check(int a,int b,int r)//就是这里
{
ll disq=(p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y)
+(p[a].z-p[b].z)*(p[a].z-p[b].z);
r*=2;
if(disq<=r*r)return 1;
else return 0;
}
void input()
{
memset(nl,0,sizeof nl);
memset(ml,0,sizeof ml);
memset(vis,0,sizeof vis);
flag=0;
for(int i=0;i<N;i++)to[i].clear();
scanf("%d%d%d",&n,&h,&r);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
if(p[i].z+r>=h)nl[i]=1;
if(p[i].z-r<=0)ml[i]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&check(i,j,r))
{
to[i].push_back(j);
//printf("%d->%d\n",i,j);
}
}
}
//cout<<"------------------\n";
}
void dfs(int u)
{
if(ml[u])return void(flag=1);
vis[u]=1;
for(int v:to[u])
{
if(!vis[v])
dfs(v);
}
}
void work()
{
input();
for(int i=1;i<=n;i++)
if(!flag&&nl[i])dfs(i);
printf(flag?"Yes\n":"No\n");
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int t;cin>>t;
while(t--)
{
work();
}
}