1. 程式人生 > >[USACO2011 Open]Corn Maze玉米迷宮

[USACO2011 Open]Corn Maze玉米迷宮

des spl 不能 lap 空格 圖片 分享 HA pac

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

#.####

#.@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 }
View Code

[USACO2011 Open]Corn Maze玉米迷宮