NOIP 2017 提高组 奶酪___dfs

题目大意:

这里写图片描述这里写图片描述这里写图片描述这里写图片描述

题解:

这题有多种做法,我来讲讲怎么去实现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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值