这是一道简单的搜索题,题意是给你一个立体图形L,R,C。其中L代表高,R和C代表长和宽,从S出发到E,中间只能走'.',不能走'#',一次只能向上或者向下或者向前向后向左向右一步。和正常的二维的BFS相同,只不过加了一个维度,但是具体操作没有改变,还是求两点间的最短距离,加上向上向下两种情况即可。
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
int k, n, m, ans;
int ax[6] = {0, 0, 1, -1, 0, 0},
ay[6] = {0, 0, 0, 0, 1, -1},
az[6] = {-1, 1, 0, 0, 0, 0};
char M[50][50][50];
int used[50][50][50];
struct l{
int x, y, z;
int step;
}a, b;
bool ff(int z, int x, int y)
{
if(z >= 0 && z < k && x >= 0 && x < n && y >= 0 && y < m)
return true;
return false;
}
void BFS()
{
queue<l> q;
l f, s;
q.push(a);
while(!q.empty()) {
f = q.front();
q.pop();
for(int i = 0; i < 6; i++) {
s.z = f.z + az[i];
s.x = f.x + ax[i];
s.y = f.y + ay[i];
s.step = f.step + 1;
if(ff(s.z, s.x, s.y) && !used[s.z][s.x][s.y] && M[s.z][s.x][s.y] != '#') {
used[s.z][s.x][s.y] = 1;
if(M[s.z][s.x][s.y] == 'E') {
ans = s.step;
return;
}
q.push(s);
}
}
}
}
int main()
{
while(cin >> k >> n >> m && k) {
memset(used, 0, sizeof(used));
ans = 0;
for(int t = 0; t < k; t++) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
cin >> M[t][i][j];
if(M[t][i][j] == 'S') {
a.z = t;
a.x = i;
a.y = j;
a.step = 0;
}
if(M[t][i][j] == 'E') {
b.z = t;
b.x = i;
b.y = j;
}
}
}
}
BFS();
if(ans) {
cout << "Escaped in "<< ans << " minute(s)." << endl;
}
else
cout << "Trapped!" << endl;
}
return 0;
}