刚看到这道题其实还是有点懵,但仔细看后才发现这是一道水题。
迷宫一类题目一般都是用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.