[USACO2011 Open]Corn Maze玉米迷宫

来源:互联网 发布:淘宝网客服打不开 编辑:程序博客网 时间:2024/04/28 00:34

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传送,再从另一端 走出迷宫

裸BFS。oj编译器选错卡拉半小时。。。

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<set>#include<ctime>#include<vector>#include<cmath>#include<algorithm>#include<map>#define inf 1000000000#define ll long longusing namespace std;const double pi=acos(-1.0);inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};int n,m,bx,by,ex,ey;int a[26][4];char mp[1005][1005];bool vis[1005][1005];struct data{int x,y,step;}q[1000005];void next(int &x,int &y,char ch){    int t=ch-'A';    if(a[t][0]==x&&a[t][1]==y)        x=a[t][2],y=a[t][3];    else x=a[t][0],y=a[t][1];}void bfs(){    int head=0,tail=1;    q[head].x=bx;q[head].y=by;vis[bx][by]=1;    while(head!=tail)    {        int x=q[head].x,y=q[head].y,step=q[head].step;head++;        for(int i=0;i<4;i++)        {            int nowx=x+xx[i],nowy=y+yy[i];            if(mp[nowx][nowy]=='#'||vis[nowx][nowy]||nowx<1||nowy<1||nowx>n||nowy>m)                continue;            vis[nowx][nowy]=1;            if(mp[nowx][nowy]>='A'&&mp[nowx][nowy]<='Z')                next(nowx,nowy,mp[nowx][nowy]);            if(nowx==ex&&nowy==ey){printf("%d\n",step+1);return;}            q[tail].x=nowx;q[tail].y=nowy;q[tail].step=step+1;tail++;        }    }}int main(){    n=read();m=read();    for(int i=1;i<=n;i++)    {        scanf("%s",mp[i]+1);        for(int j=1;j<=m;j++)        {            char t=mp[i][j];            if(t>='A'&&t<='Z')            {                if(!a[t-'A'][0])                    a[t-'A'][0]=i,a[t-'A'][1]=j;                else a[t-'A'][2]=i,a[t-'A'][3]=j;            }            else if(t=='@')bx=i,by=j;            else if(t=='=')ex=i,ey=j;        }    }    bfs();    return 0;}


0 0
原创粉丝点击