P2199 最後的迷宮

2021-09-03 03:32:47 字數 1853 閱讀 9625

剛看到這道題其實還是有點懵,但仔細看後才發現這是一道水題。

迷宮一類題目一般都是用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

給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...