题目大意:
题解:
这题有多种做法,我来讲讲怎么去实现dfs,虽然也可用bfs啊,并查集啊去实现,可是搜索的代码实现很容易。
①将老鼠一开始能到的空洞标记,即所有满足圆心zi-r≤0的空洞。
②以这些空洞为基础去看是否能够到达其他空洞,需满足2个圆点间距离≤2*r。
③被标记过的点除了一开始的基础点,其他不需要再次搜,大力剪枝,暴力AC。
代码:
var
x,y,z,f:array [-5..1001] of extended;
t,i,n,h,r:longint;
cp:boolean;
function check(x1,y1,z1,x2,y2,z2:extended):boolean;
var
rp:extended;
begin
rp:=sqrt(sqr(x1-x2)+sqr(y1-y2)+sqr(z1-z2));
if rp<=2*r then exit(true);
exit(false);
end;
procedure dfs(dep:longint);
var
i:longint;
begin
for i:=1 to n do
if f[i]=0 then
if check(x[dep],y[dep],z[dep],x[i],y[i],z[i]) then
begin
f[i]:=-1;
dfs(i);
end;
end;
begin
readln(t);
f[-1]:=-1;
while t>=1 do
begin
readln(n,h,r);
fillchar(f,sizeof(f),0);
for i:=1 to n do
begin
readln(x[i],y[i],z[i]);
if z[i]-r<=0 then f[i]:=-1;
end;
for i:=1 to n do
if f[i]=-1 then dfs(i);
cp:=true;
for i:=1 to n do
begin
if not(cp) then break;
if f[i]=-1 then
if z[i]+r>=h then
begin
writeln('Yes');
cp:=false;
end;
end;
if cp then writeln('No');
dec(t);
end;
end.