剛看到這道題其實還是有點懵,但仔細看後才發現這是一道水題。
迷宮一類題目一般都是用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');//特判
endelse
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.
洛谷P2199 最後的迷宮 BFS DFS
給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...
洛谷P2199 最後的迷宮 BFS DFS
給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...
洛谷P2199 最後的迷宮 BFS DFS
給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...