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

本文介绍了一种解决带有传送门的迷宫中寻找最短路径的问题。通过使用BFS算法,并考虑传送门的特殊性,可以有效地找到从起点到终点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值