您的位置:首页 > 其它

NOIP 2017 提高组 奶酪___dfs

2018-03-08 17:10 309 查看

题目大意:









题解:

这题有多种做法,我来讲讲怎么去实现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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: