Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 16590 | Accepted: 6451 |
Description
Input
Output
Escaped in x minute(s).
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
Source
题目链接 :http://poj.org/problem?id=2251
题目大意 :三维迷宫求最短路
题目分析 :之前写了一篇二维迷宫,将其三维化即可,还是用BFS
#include <cstdio> #include <cstring> #include <queue> using namespace std; int const MAX = 31; char map[MAX][MAX][MAX]; int vis[MAX][MAX][MAX]; int x, y, z; int dirx[6] = {0,0,0,0,1,-1}; int diry[6] = {0,0,1,-1,0,0}; int dirz[6] = {1,-1,0,0,0,0}; int sx, sy, sz; int ex, ey, ez; struct Point { int x, y, z; int step; }; int BFS() { memset(vis,0,sizeof(vis)); queue<Point> q; Point node, t; node.x = sx; node.y = sy; node.z = sz; node.step = 0; q.push(node); vis[sx][sy][sz] = 1; while(!q.empty()) { node = q.front(); q.pop(); for(int i = 0; i < 6; i++) //6个方向 { t = node; t.x += dirx[i]; t.y += diry[i]; t.z += dirz[i]; t.step++; if(t.x == ex && t.y == ey && t.z == ez) return t.step; if(t.x < 1 || t.x > x || t.y < 1 || t.y > y || t.z < 1 || t.z > z || !map[t.x][t.y][t.z] || vis[t.x][t.y][t.z]) continue; else { vis[t.x][t.y][t.z] = 1; q.push(t); } } } return -1; } int main() { char str[31]; while(scanf("%d %d %d", &x, &y, &z) != EOF && (x+y+z)) { memset(map,1,sizeof(map)); for(int i = 1; i <= x; i++) { for(int j = 1; j <= y; j++) { scanf("%s",str + 1); //这里要注意,输入的字符下标从1开始 for(int k = 1; k <= z; k++) { if(str[k] == 'S') { sx = i; sy = j; sz = k; } if(str[k] == 'E') { ex = i; ey = j; ez = k; } if(str[k] == '#') map[i][j][k] = 0; } } } if(BFS() == -1) printf("Trapped!\n"); else printf("Escaped in %d minute(s).\n", BFS()); } }