P2199 最后的迷宫

刚看到这道题其实还是有点懵,但仔细看后才发现这是一道水题
迷宫一类题目一般都是用bfs为主,因为一但搜索答案便可以退出,比dfs快多了。
这题考点估计是可以看见,而不是碰到,这其实只要再用一个二维数组记录,即有多个答案。
代码:

const z:array[1..8,1..2]of -1..1=((1,0),(0,1),(-1,0),(0,-1),(1,1),(1,-1),(-1,1),(-1,-1));//前四个方向为走的,八个方向是方便判断是否可以看见
var i,j,k:longint;
    m,n:longint;
    ch:char;
    h,t:longint;
    x1,y1,x2,y2:longint;
    a,b:array[0..1001,0..1001]of boolean;
    c,d:array[0..1001,0..1001]of boolean;
    x,y,u:array[0..1000001]of longint;
begin
  readln(m,n);//读入
  for i:=1 to m do
  begin
    for j:=1 to n do
    begin
      read(ch);
      if ch='O' then a[i,j]:=true
      else a[i,j]:=false;
    end;
    readln;
  end;
  b:=a;//数组记录,因为bfs中,会改变
  x1:=1;
  while x1<>0 do//根据题目
  begin
  a:=b;
  c:=d;
  read(x2,y2,x1,y1);
  if x1=0 then exit;
  if not a[x2,y2] or not a[x1,y1] then
  begin
    writeln('Poor Harry');//特判
  end
  else
  begin
  c[x2,y2]:=true;//走到自然看到了
  for i:=1 to 8 do//八个方向枚举
  begin
    j:=x2;
    k:=y2;
    while a[j+z[i,1],k+z[i,2]] do//直到碰到墙壁
    begin
      j:=j+z[i,1];
      k:=k+z[i,2];
      c[j,k]:=true;
    end;
  end;
  h:=1;
  t:=1;
  x[1]:=x1;
  y[1]:=y1;
  u[1]:=0;
  k:=0;
  repeat//bfs
    if c[x[t],y[t]] then//如果当前位置可以看到,则输出
    begin
      writeln(u[t]);
      k:=1;
      break;
    end;
    for i:=1 to 4 do
    if a[x[t]+z[i,1],y[t]+z[i,2]] then
    begin
      inc(h);
      x[h]:=x[t]+z[i,1];
      y[h]:=y[t]+z[i,2];
      a[x[h],y[h]]:=false;//记录为走过,即不能再走
      u[h]:=u[t]+1;//步数加一
    end;
    inc(t);
  until t>h;
  if k=0 then writeln('Poor Harry');//无解时输出
  end;
  end;
end.

猜你喜欢

转载自blog.csdn.net/sxy__orz/article/details/85018672
今日推荐