(2)獻給阿爾吉儂的花束(flower.pas/c/cpp)
(2)獻給阿爾吉儂的花束(flower.pas/c/cpp)
【描述】
阿爾吉儂是一隻聰明又慵懶的小白鼠,它最擅長的就是走各種各樣的迷宮。今天它要挑戰一個非常大的迷宮,研究員們為了鼓勵阿爾吉儂儘快到達終點,就在終點放了一塊阿爾吉儂最喜歡的乳酪。現在研究員們想知道,如果阿爾吉儂足夠聰明,它最少需要多少時間就能吃到乳酪。
迷宮用一個R×C的字元矩陣來表示。字元S表示阿爾吉儂所在的位置,字元E表示乳酪所在的位置,字元#表示牆壁,字元.表示可以通行。阿爾吉儂在1個單位時間內可以從當前的位置走到它上下左右四個方向上的任意一個位置,但不能走出地圖邊界。
【輸入】
第一行是一個正整數T(1 <= T <= 10),表示一共有T組資料。
每一組資料的第一行包含了兩個用空格分開的正整數R和C(2 <= R, C <= 200),表示地圖是一個R×C的矩陣。
接下來的R行描述了地圖的具體內容,每一行包含了C個字元。字元含義如題目描述中所述。保證有且僅有一個S和E。
【輸出】
對於每一組資料,輸出阿爾吉儂吃到乳酪的最少單位時間。若阿爾吉儂無法吃到乳酪,則輸出“oop!”(只輸出引號裡面的內容,不輸出引號)。每組資料的輸出結果佔一行。
【樣例輸入】
3
3 4
.S..
###.
..E.
3 4
.S..
.E..
....
3 4
.S..
####
..E.
【樣例輸出】
5
1
oop!
【自己題解】
type xy=record
nx:longint;
ny:longint;
nz:longint;
end;
var
s,k,x,y,i,j,ax,ay,h,t,tx,ty:longint;
a:array[0..21,0..21] of char;
b:array[0..401] of xy;
c:array[0..21,0..21] of boolean;
dx:array[1..4]of longint=(1,0,-1,0);
dy:array[1..4]of longint=(0,1,0,-1);
procedure bfs;
begin
h:=1;
t:=1;
repeat
for i:=1 to 4 do
begin
tx:=b[h].nx+dx[i];
ty:=b[h].ny+dy[i];
if (tx>=1)and(tx<=x)and(ty>=1)and(ty<=y)and(not c[tx,ty]) then
begin
inc(t);
b[t].nx:=tx;
b[t].ny:=ty;
b[t].nz:=b[h].nz+1;
c[tx,ty]:=true;
if (tx=ax)and(ty=ay) then
begin
writeln(b[t].nz);
exit;
end;
end;
end;
inc(h);
until h>t;
writeln('oop!');
end;
procedure pin(s:string);
begin
assign(input,s+'.in');reset(input);
assign(output,s+'.out');rewrite(output);
end;
procedure pout;
begin
close(input);close(output);
end;
begin
pin('flower');
readln(s);
for k:=1 to s do
begin
readln(x,y);
fillchar(c,sizeof(c),false);
for i:=1 to x do
begin
for j:=1 to y do
begin
read(a[i,j]);
if (a[i,j]='S') then
begin
b[1].nx:=i;
b[1].ny:=j;
b[1].nz:=0;
end;
if (a[i,j]='E') then
begin
ax:=i;
ay:=j;
end;
if (a[i,j]='#') then
c[i,j]:=true;
end;
readln;
end;
bfs;
end;
pout;
end.