zoukankan      html  css  js  c++  java
  • 3299: [USACO2011 Open]Corn Maze玉米迷宫

    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.
  • 相关阅读:
    HDU
    POJ
    快速幂运算
    RocketMQ集群
    RocketMQ角色介绍
    RocketMQ初探
    MySQL 串行隔离级别小记
    分布式事务笔记
    MySQL分库分表篇
    MySQL主从篇
  • 原文地址:https://www.cnblogs.com/HansBug/p/4397180.html
Copyright © 2011-2022 走看看