不难, 图的BFS。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <utility>
#include <tuple>
#include <algorithm>
using namespace std;
const int size = 30 + 10;
char s[size][size][size];
int v[size][size][size];
int d[][3] = { {0 , 0 , -1} , {0 , 0 , 1} , {0 , -1 , 0} , {0 , 1 , 0} ,
{1 , 0 , 0} , {-1 , 0 , 0}};
int main()
{
int h , r , c;
while(cin >> h >> r >> c && h && r && c)
{
memset(s , 0 , sizeof(s));
memset(v , -1 , sizeof(v));
for(int i = 0 ; i < h ; ++i)
{
for(int j = 0 ; j < r ; ++j)
{
cin >> s[i][j];
}
}
auto start = find(p , (p + sizeof(s)) , 'S');
auto finish = find(p , (p + sizeof(s)) , 'E');
*start = *finish = '.';
int a[3] , b[3];
char *p = (char*)s;
a[0] = (start - p) / size / size;
a[1] = ((start - p) - a[0] * size * size) / size;
a[2] = (start - p) % size;
b[0] = (finish - p) / size / size;
b[1] = ((finish - p) - b[0] * size * size) / size;
b[2] = (finish - p) % size;
int z , x , y;
queue< tuple<int , int , int> > q;
v[a[0]][a[1]][a[2]] = 0;
q.push(make_tuple(a[0] , a[1] , a[2]));
while ( !q.empty() )
{
z = get<0>(q.front());
x = get<1>(q.front());
y = get<2>(q.front());
if(z == b[0] && x == b[1] && y == b[2]) break;
q.pop();
for(int i = 0 ; i < 6 ; ++i)
{
int tz = z + d[i][0];
int tx = x + d[i][1];
int ty = y + d[i][2];
if(tz < 0 || tz >= h) continue;
if(tx < 0 || tx >= r) continue;
if(ty < 0 || ty >= c) continue;
if(s[tz][tx][ty] == '#' || v[tz][tx][ty] >= 0) continue;
v[tz][tx][ty] = v[z][x][y] + 1;
q.push(make_tuple(tz , tx , ty));
}
}
if(q.empty()) cout << "Trapped!" << endl;
else cout << "Escaped in "<< v[z][x][y]<< " minute(s)." << endl;
}
return 0;
}