Time Limit: 10 Sec Memory Limit: 128 MB
Description
今年秋天,约翰带着奶牛们去玩玉米迷宫。迷宫可分成NxM个格子,有些格子种了玉 米,种宥玉米的格子无法通行
。迷宫的四条边界上都是种了玉米的格子,其屮只有一个格子 没种,那就是出口。在这个迷宫里,有一些神奇的
传送点6每个传送点由一对点组成,一旦 走入传送点的某个结点,机器就会强制把你送到传送点的另一头去。所有
的传送点都是双向 的,如果你定到了另一头,机器也会把你送回来。奶牛在一个单位的时间内只能向相邻的四个
方向移动一格,不过传送机传送是瞬间完成 的。现在W西在迷宫里迷路了,她只知道目前的位罝在哪里,请你帮助
她用最短的时间走出 迷宫吧。
Input
第一行:两个用空格分开的整数:N和M,2
第二行到N+1行:第i+1行有M个连续的字符,描述了迷宫第i行的信息。
其中"#"代 表不能通行的玉米地, "."代表可以通行的草地,
"@"代表贝西的起始位罝,"="代表迷宫出口,
大写字母“A”到“Z”总是成对出现的,代表一对传送点
Output
一个整数,表示贝西走出迷宫的最短时间,保证逃离迷宮的路线一定存在
Sample Input
5 6
###=##
#.W.##
#.####
######
Sample Output
3
//从起点向右走,通过w传送,再从另一端 走出迷宫
HINT
Source
Silver
解:
期望:100 实际:58
坑点:到达传送点之后强制传送
知道自己的代码水平还是太弱。
一定要加油啊。
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int N=500; 6 int n,m,sx,sy,tx,ty; 7 int b[N][N],l[N][3],to[N][3]; 8 char s[N]; 9 int d[N][N],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; 10 int fx,fy,rx,ry,tmp,cnt; 11 queue<int>qx,qy; 12 void bfs() 13 { 14 d[tx][ty]=0; 15 qx.push(tx);qy.push(ty); 16 while(!qx.empty()) 17 { 18 fx=qx.front();qx.pop(); 19 fy=qy.front();qy.pop(); 20 for(int i=0;i<=3;++i) 21 { 22 rx=fx+dx[i];ry=fy+dy[i]; 23 if(rx<1 || rx>n || ry<1 || ry>m) continue; 24 if(!b[rx][ry]) continue; 25 if(b[rx][ry]>1) 26 { 27 tmp=b[rx][ry]; 28 rx=to[tmp][1];ry=to[tmp][2]; 29 } 30 if(d[rx][ry]>d[fx][fy]+1) 31 { 32 d[rx][ry]=d[fx][fy]+1; 33 qx.push(rx),qy.push(ry); 34 } 35 } 36 } 37 } 38 int main() 39 { 40 scanf("%d%d",&n,&m); 41 cnt=4; 42 for(int i=1,u;i<=n;++i) 43 { 44 scanf("%s",s+1); 45 for(int j=1;j<=m;++j) 46 { 47 if(s[j]==‘@‘) sx=i,sy=j,b[i][j]=1; 48 else if(s[j]==‘.‘) b[i][j]=1; 49 else if(s[j]==‘=‘) tx=i,ty=j,b[i][j]=1; 50 else if(s[j]==‘#‘) b[i][j]=0; 51 else { 52 u=s[j]; 53 if(l[u][0]==0) l[u][0]=++cnt,l[u][1]=i,l[u][2]=j; 54 else{ 55 cnt++; 56 to[cnt][1]=l[u][1];to[cnt][2]=l[u][2]; 57 to[l[u][0]][1]=i,to[l[u][0]][2]=j; 58 } 59 b[i][j]=cnt; 60 } 61 } 62 } 63 for(int i=1;i<=n;++i) 64 for(int j=1;j<=m;++j) 65 d[i][j]=1e9; 66 bfs(); 67 printf("%d",d[sx][sy]); 68 return 0; 69 }