```cpp
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int f[1010];
struct Dian{
double x,y,z;
}dian[10010];
double dis[1010][1010];
double js(int a,int b)
{
double t1=abs(dian[a].x-dian[b].x);
double t2=abs(dian[a].y-dian[b].y);
double t3=abs(dian[a].z-dian[b].z);
int tt=t1*t1+t2*t2+t3*t3;
return sqrt(tt);
}
void csh()
{
for(int i=1;i<=10010;i++)
dian[i].x=dian[i].y=dian[i].z=0;
}
int find(int k)
{
if(f[k]==k) return k;
return f[k]=find(f[k]);
}
int pd(int a,int b)
{
int t1=find(a),t2=find(b);
if(t1==t2) return 1;
else return 0;
}
void hb(int a,int b)
{
int t1=find(a),t2=find(b);
f[t1]=t2;
}
int main()
{
int t;
cin>>t;
for(int k=1;k<=t;k++)
{
int n,h,r;
csh();
cin>>n>>h>>r;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=n;i++)
cin>>dian[i].x>>dian[i].y>>dian[i].z;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
double t=js(i,j);
if(t<=2*r) hb(i,j);
}
bool b[1010];memset(b,0,sizeof(b));
int c[1010];memset(c,0,sizeof(c));
int cnt=0;
for(int i=1;i<=n;i++)
{
if(!b[find(i)])
{
c[++cnt]=find(i);
b[find(i)]=1;
}
}
int flag=0;
for(int i=1;i<=cnt;i++)
{
double minn=0x7fffffff,maxx=-156;
for(int j=1;j<=n;j++)
{
int t1=find(j);
if(t1==c[i])
{
minn=min(minn,dian[j].z);
maxx=max(minn,dian[j].z);
}
if((maxx+r)>=h&&(minn-r)<=0) flag=1;
}
}
if(flag==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
```
by aa58760 @ 2018-06-14 22:01:51
边界没处理好吧,再想想
by 少帅_zjm @ 2018-06-14 23:01:09
记得特判n=1的情况 @[aa58760](/space/show?uid=48791)
by bztMinamoto @ 2018-06-15 19:03:43