CF540C Ice Cave

题目有毒呀,翻译有问题…
先码了一个DFS 瞄了一眼题解里都是dfs

const z:array[1..4,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1));
var i,j,k:longint;
    m,n:longint;
    ch:char;
    a,b:array[0..100,0..100]of boolean;
    x,y:array[0..10000]of longint;
    fx,fy,lx,ly:longint;
procedure yes;
begin
  write('YES');
  halt;
end;
procedure pd(x,y:longint);//判断是否可以落到终点
var i:longint;
begin
  if not a[x,y] then yes;//如果终点就是碎冰那么可以直接掉下去
  for i:=1 to 4 do if a[x+z[i,1],y+z[i,2]] then yes;//不是碎冰要看看旁边有没有浮冰
end;
procedure dfs(x,y:longint);//深度优先搜索,就是暴力呀QAQ
var i:longint;
begin
  if(x=lx)and(y=ly)then//到终点了
  begin
  pd(x,y);
  exit;
  end;
  if not a[x,y] then exit;
  a[x,y]:=false;
  for i:=1 to 4 do
  dfs(x+z[i,1],y+z[i,2]);
  a[x,y]:=true;
end;
begin
  readln(m,n);
  for i:=1 to m do
  begin
    for j:=1 to n do
    begin
      read(ch);
      if ch='X' then a[i,j]:=false;
      if ch='.' then a[i,j]:=true;
    end;
    readln;
  end;
  readln(fx,fy,lx,ly);
  a[fx,fy]:=true;
  dfs(fx,fy);
  write('NO');//到不了QAQ
end.

成功TLE祭
又费力改成bfs

const z:array[1..4,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1));
var i,j,k:longint;
    m,n,h,t:longint;
    ch:char;
    a,b:array[0..601,0..601]of boolean;
    x,y:array[0..1000000]of longint;
    fx,fy,lx,ly:longint;
procedure yes;
begin
  write('YES');
  halt;
end;
procedure no;
begin
  write('NO');
  halt;
end;
begin
  readln(m,n);
  for i:=1 to m do
  begin
    for j:=1 to n do
    begin
      read(ch);
      if ch='X' then a[i,j]:=false;
      if ch='.' then a[i,j]:=true;
    end;
    readln;
  end;
  readln(fx,fy,lx,ly);
  a[fx,fy]:=true;
  if (fx=lx)and(fy=ly) then//如果起点就是终点(玄学),那么要去旁边跳一下
  begin
    k:=0;
    for i:=1 to 4 do
    if a[lx+z[i,1],ly+z[i,2]] then inc(k);
    if k<1 then no else yes;
  end;
  if a[lx,ly] then//如果终点是浮冰,那么需要从一个浮冰过来,再去一个浮冰跳一下
  begin
    k:=0;
    for i:=1 to 4 do
    if a[lx+z[i,1],ly+z[i,2]] then inc(k);
    if k<2 then no;//浮冰数>=2有可能才行
  end else
  a[lx,ly]:=true;//终点赋值为true
  h:=1;
  t:=1;
  x[1]:=fx;
  y[1]:=fy;
  repeat//裸的bfs
    if(x[t]=lx)and(y[t]=ly)then yes;
    for i:=1 to 4 do
    if a[x[t]+z[i,1],y[t]+z[i,2]] then
    begin
      inc(h);
      a[x[t]+z[i,1],y[t]+z[i,2]]:=false;
      x[h]:=x[t]+z[i,1];
      y[h]:=y[t]+z[i,2];
    end;
    inc(t);
  until t>h;
  no;
end.

除了题目翻译有问题,其他都还行…吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值