题目链接:http://poj.org/problem?id=2251
题目:
Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
题意:你处在一个三维的地牢里,从S出发逃到出口E,问最少要跑多远。
思路:这题虽然是一个三维的地图,但是做法和二维的没多大区别,不过要从当前层到其他层的要求是你所在位置为非#,且你将到的那层的这个位置也是非#。
代码实现如下:
1 #include <queue> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int inf = 0x3f3f3f3f; 7 int l, r, c, ans; 8 int sx, sy, sz; 9 char mp[35][35][35]; 10 int vis[35][35][35]; 11 12 struct node { 13 int x, y, z, step; 14 }nw, nxt; 15 16 int dx[6] = {1, -1, 0, 0, 0, 0}, dy[6] = {0, 0, 1, -1, 0, 0}, 17 dz[6] = {0, 0, 0, 0, 1, -1}; 18 19 void bfs(int z, int x, int y) { 20 vis[z][x][y] = 1; 21 nw.z = z, nw.x = x, nw.y = y, nw.step = 0; 22 queue<node> q; 23 q.push(nw); 24 while(!q.empty()) { 25 nw = q.front(), q.pop(); 26 if(mp[nw.z][nw.x][nw.y] == ‘E‘) { 27 ans = nw.step; 28 return; 29 } 30 for(int i = 0; i < 6; i++) { 31 nxt.z = nw.z + dz[i]; 32 nxt.x = nw.x + dx[i]; 33 nxt.y = nw.y + dy[i]; 34 if(nxt.z >= 0 && nxt.z < l && nxt.x >= 0 && nxt.x < r && nxt.y >=0 && nxt.y < c && vis[nxt.z][nxt.x][nxt.y] == 0 && mp[nxt.z][nxt.x][nxt.y] != ‘#‘) { 35 nxt.step = nw.step + 1; 36 vis[nxt.z][nxt.x][nxt.y] = 1; 37 q.push(nxt); 38 } 39 } 40 } 41 } 42 43 int main() { 44 while(~scanf("%d%d%d", &l, &r, &c) && (l + r + c)) { 45 for(int i = 0; i < l; i++) { 46 for(int j = 0; j < r; j++) { 47 scanf("%s", mp[i][j]); 48 for(int k = 0; k < c; k++) { 49 if(mp[i][j][k] == ‘S‘) { 50 sx = j, sy = k, sz =i; 51 } 52 } 53 } 54 } 55 memset(vis, 0, sizeof(vis)); 56 ans = inf; 57 bfs(sz, sx, sy); 58 if(ans >= inf) { 59 printf("Trapped!\n"); 60 } else { 61 printf("Escaped in %d minute(s).\n", ans); 62 } 63 } 64 return 0; 65 }
原文:https://www.cnblogs.com/Dillonh/p/8974741.html