题目链接
也是做了很久,光得80分,注意数据的精度,用long
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
public static int t,r,res=0,max=0;
public static void main(String[] args)throws IOException {
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
sc.nextToken();
t=(int)sc.nval;
while(t!=0){
int n,h,r;
sc.nextToken();
n=(int)sc.nval;
sc.nextToken();
h=(int)sc.nval;
sc.nextToken();
r=(int)sc.nval;
dong[] d=new dong[n];
for(int i=0;i<n;i++){
sc.nextToken();
int a=(int)sc.nval;
sc.nextToken();
int b=(int)sc.nval;
sc.nextToken();
int c=(int)sc.nval;
d[i]=new dong(a,b,c);
}
bfs(d,h,r,n);
t--;
}
}
public static void bfs(dong[] d,int h,int r,int n){
Queue<dong> q=new LinkedList<dong>();
int[] is=new int[n];
for(int i=0;i<n;i++){
if(d[i].z-r<=0&&d[i].z+r>=0){
q.offer(d[i]);
is[i]=1;
}
}
while(!q.isEmpty()){
dong cur=q.poll();
//System.out.println(cur.z);
if(cur.z+r>=h&&cur.z-r<=h){
System.out.println("Yes");
return;
}
for(int i=0;i<n;i++){
if(d[i].z+r<cur.z-r||d[i].z-r>cur.z+r||is[i]==1)
continue;
//System.out.println(222);
if(s(d[i],cur,r)){
q.offer(d[i]);
is[i]=1;
}
}
}
System.out.println("No");
return;
}
public static boolean s(dong a,dong b,long r){
long xf=(a.x-b.x)*(a.x-b.x);
long yf=(a.y-b.y)*(a.y-b.y);
long zf=(a.z-b.z)*(a.z-b.z);
return (xf+yf+zf)<=4*r*r;
}
}
class dong{
long x,y,z;
public dong(long a,long b,long c){
x=a;y=b;z=c;
}
}