3299: [USACO2011 Open]Corn Maze玉米迷宫
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 137 Solved: 59
[Submit][Status][Discuss]
Description
今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行。
迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。
在这个迷宫里,有一些神奇的传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,
机器就会强制把你送到传送点的另一头去。所有的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。
奶牛在一个单位的时间内只能向相邻的四个方向移动一格,不过传送机传送是瞬间完成 的。
现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助她用最短的时间走出 迷宫吧。
Input
第一行:两个用空格分开的整数:N和M,2
第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。其中"#"代 表不能通行的玉米地,
"."代表可以通行的草地,"@"代表贝西的起始位罝,"="代表迷宫出口,
大写字母“A”到“Z”总是成对出现的,代表一对传送点
Output
第一行:一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在
Sample Input
5 6
###=##
#.W.##
#.####
#[email protected]##
######
Sample Output
3
HINT
从起点向右走,通过w传送,再从另一端 走出迷宫
Source
题解:做过无数道BFS迷宫类水题了,但是这个比较神奇一点。。。其实就是多个传动点之间的瞬间传送,别的没了。。
1 const dd:array[1..4,1..2] of longint=((1,0),(-1,0),(0,-1),(0,1)); 2 var 3 i,j,k,l,m,n,x0,y0,x1,y1,x,y,f,r:longint; 4 a,b:array[0..1000,0..1000] of longint; 5 tr:array[2..27,1..4] of longint; 6 d:array[0..1000000,1..2] of longint; 7 ch:char; 8 procedure trans(z:longint;var x,y:longint); 9 begin 10 if (z<2) or (z>27) then exit; 11 if (tr[z,1]=x) and (tr[z,2]=y) then 12 begin 13 x:=tr[z,3];y:=tr[z,4]; 14 end 15 else if (tr[z,3]=x) and (tr[z,4]=y) then 16 begin 17 x:=tr[z,1];y:=tr[z,2]; 18 end; 19 end; 20 begin 21 readln(n,m); 22 fillchar(a,sizeof(a),-1); 23 fillchar(tr,sizeof(tr),0); 24 for i:=1 to n do 25 begin 26 for j:=1 to m do 27 begin 28 read(ch); 29 case upcase(ch) of 30 ‘#‘:a[i,j]:=1; 31 ‘.‘:a[i,j]:=0; 32 ‘=‘:begin 33 x1:=i;y1:=j; 34 a[i,j]:=0; 35 end; 36 ‘@‘:begin 37 x0:=i;y0:=j; 38 a[i,j]:=1; 39 end; 40 ‘A‘..‘Z‘:begin 41 a[i,j]:=ord(ch)-63; 42 if tr[a[i,j],1]=0 then 43 begin 44 tr[a[i,j],1]:=i; 45 tr[a[i,j],2]:=j; 46 end 47 else 48 begin 49 tr[a[i,j],3]:=i; 50 tr[a[i,j],4]:=j; 51 end; 52 end; 53 end; 54 end; 55 readln; 56 end; 57 f:=1;r:=2;d[1,1]:=x0;d[1,2]:=y0;b[x0,y0]:=1; 58 while f<r do 59 begin 60 for i:=1 to 4 do 61 begin 62 x:=d[f,1]+dd[i,1]; 63 y:=d[f,2]+dd[i,2]; 64 if (x<1) or (x>n) or (y<1) or (y>m) then continue; 65 if abs(a[x,y])=1 then continue; 66 trans(a[x,y],x,y); 67 if b[x,y]=0 then 68 begin 69 b[x,y]:=b[d[f,1],d[f,2]]+1; 70 d[r,1]:=x;d[r,2]:=y; 71 if (x=x1) and (y=y1) then 72 begin 73 writeln(b[x,y]-1); 74 halt; 75 end; 76 inc(r); 77 end; 78 end; 79 inc(f); 80 end; 81 end.
时间: 2024-10-13 14:17:38