传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=3299
题目大意
求最短路,路上有传送门,站到其中一个点立即被传送到另一个点,不花费时间
题解
BFS,注意细节
const
c:array[1..4]of longint=(0,-1,0,1);
d:array[1..4]of longint=(-1,0,1,0);
var
w:array[0..300,0..300]of char;
z:array[0..300,0..300]of longint;
a:array[0..300,0..300,1..2]of longint;
b:array[0..26,1..2]of longint;
t:array[0..1000000,1..3]of longint;
i,j,k:longint;
n,m,tt,x,y,x1,y1,head,tail:longint;
begin
fillchar(b,sizeof(b),0);
fillchar(a,sizeof(a),0);
fillchar(z,sizeof(z),0);
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(w[i,j]);
if w[i,j]='@' then begin x:=i; y:=j; end;
if (ord(w[i,j])>64)and(ord(w[i,j])<91)
then begin
tt:=ord(w[i,j])-64;
if b[tt,1]=0
then begin b[tt,1]:=i; b[tt,2]:=j end
else begin a[i,j,1]:=b[tt,1]; a[i,j,2]:=b[tt,2]; a[b[tt,1],b[tt,2],1]:=i; a[b[tt,1],b[tt,2],2]:=j; end;
end;
end;
readln;
end;
head:=1; tail:=2; t[1,1]:=x; t[1,2]:=y; t[1,3]:=0; z[x,y]:=1;
while head<tail do
begin
x:=t[head,1]; y:=t[head,2]; inc(head); if w[x,y]='=' then begin writeln(t[head-1,3]); break; end;
for i:=1 to 4 do begin
x1:=x+c[i]; y1:=y+d[i];
if (x1<1)or(x1>n)or(y1<1)or(y1>m) then continue;
if w[x1,y1]='#' then continue;
if a[x1,y1,1]<>0 then begin j:=a[x1,y1,1]; k:=a[x1,y1,2]; x1:=j; y1:=k; end;
if (z[x1,y1]=1) then continue;
t[tail,1]:=x1; t[tail,2]:=y1; t[tail,3]:=t[head-1,3]+1; inc(tail);
z[x1,y1]:=1;
end;
end;
end.