前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3299: [USACO2011 Open]Corn Maze玉米迷宫

3299: [USACO2011 Open]Corn Maze玉米迷宫

作者头像
HansBug
发布2018-04-11 10:14:22
7170
发布2018-04-11 10:14:22
举报
文章被收录于专栏:HansBug's LabHansBug's Lab

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.## #.#### #.@W## ######

Sample Output

3

HINT

从起点向右走,通过w传送,再从另一端 走出迷宫

Source

Silver

题解:做过无数道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.
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-04-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3299: [USACO2011 Open]Corn Maze玉米迷宫
  • Description
  • Input
  • Output
  • Sample Input
  • Sample Output
  • HINT
  • Source
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档