Uva--532 (BFS)
2014-07-07 02:07:12
题意&思路:三维BFS。需要注意的是,终点判断在for循环外面超时,在for循环最里面时AC,原因在于:在for循环里时,就是在走之前就判断下一步是否是终点,省了“一圈”。
1 #include <cstdio> 2 #include <iostream> 3 #include <queue> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 const int INF = 1000000000; 8 9 char g[35][35][35]; 10 int L,R,C,tmin,sr,sc,st,er,ec,et; 11 int vis[35][35][35]; 12 int dir[6][3] = {{0,0,1},{0,0,-1,},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}}; 13 14 struct node{ 15 int t,r,c,d; 16 node(){ 17 d = 0; 18 } 19 }; 20 void Bfs(){ 21 node a,b; 22 queue<node> q; 23 a.t = st; 24 a.r = sr; 25 a.c = sc; 26 vis[a.t][a.r][a.c] = 1; 27 q.push(a); 28 while(!q.empty()){ 29 a = q.front(); 30 q.pop(); 31 for(int i = 0; i < 6; ++i){ 32 b.t = a.t + dir[i][0]; 33 b.r = a.r + dir[i][1]; 34 b.c = a.c + dir[i][2]; 35 b.d = a.d + 1; 36 if(b.t >= 0 && b.t < L && b.r >= 0 && b.r < R && b.c >= 0 && b.c < C 37 && !vis[b.t][b.r][b.c] && g[b.t][b.r][b.c] != '#'){ 38 if(b.t == et && b.r == er && b.c == ec){ 39 tmin = b.d; 40 return; 41 } 42 q.push(b); 43 vis[b.t][b.r][b.c] = 1; 44 } 45 } 46 } 47 tmin = INF; 48 return; 49 } 50 int main(){ 51 //char str[35]; 52 while(scanf("%d %d %d",&L,&R,&C) == 3){ 53 if(!L && !R && !C) break; 54 memset(vis,0,sizeof(vis)); 55 memset(g,0,sizeof(g)); 56 for(int t = 0; t < L; ++t){ 57 for(int i = 0; i < R; ++i){ 58 scanf("%s",g[t][i]); 59 for(int j = 0; j < C; ++j){ 60 if(g[t][i][j] == 'S') 61 st = t,sr = i,sc = j; 62 else if(g[t][i][j] == 'E') 63 et = t,er = i,ec = j; 64 } 65 } 66 } 67 Bfs(); 68 if(tmin == INF) printf("Trapped!\n"); 69 else printf("Escaped in %d minute(s).\n",tmin); 70 } 71 return 0; 72 }

浙公网安备 33010602011771号