[BZOJ3299][USACO2011 Open]Corn Maze玉米迷宫

来源:互联网 发布:垫底辣妹原型知乎 编辑:程序博客网 时间:2024/04/28 17:28

传送门

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.
0 0
原创粉丝点击