思路还是很清晰的,就是三维空间中运用BFS的方法,中间不幸WA过两次,问题出在这里:因为想要将dungeon的周边铺满'#',这样做的好处就是判断移动的下一步是不是还在dungeon内,可以不用一组较为耗时的不等式,不过隐患在于三维空间中,一定要记住不重不漏的填补'#',此外,填充的顺序也至关重要,这道题之前提交错误就错在其他地方都已经封装好,可惜忘记封顶,这样有可能导致直接就跳出去并被之前的测试数据所影响。
其实一开始应该在每个循环初始化的时候全局填充为'#',这样省事,而且时间复杂度也不是多高
总之,边界条件一定要非常的慎重,考虑周到是训练的重要内容
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int maxs= 35;
struct Node
{
int i, j, k;
Node(int _i= 0 ,int _j= 0, int _k= 0) : i(_i), j(_j), k(_k) {}
};
int step[6][3]= {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
char du[maxs][maxs][maxs];
int l, r, c;
int si, sj, sk;
bool vis[maxs][maxs][maxs];
int dis[maxs][maxs][maxs];
int BFS()
{
queue<Node> Q;
memset(vis, 0, sizeof(vis));
vis[si][sj][sk]= 1;
dis[si][sj][sk]= 0;
Q.push(Node(si, sj, sk));
Node cur;
int i, j, k, v;
while (!Q.empty()){
cur= Q.front();
Q.pop();
i= cur.i;
j= cur.j;
k= cur.k;
v= dis[i][j][k]+1;
for (int p= 0; p< 6; ++p){
int ni= i+step[p][0], nj= j+step[p][1], nk= k+step[p][2];
if ('E'== du[ni][nj][nk]){
return v;
}
if ('.'== du[ni][nj][nk] && !vis[ni][nj][nk]){
vis[ni][nj][nk]= 1;
dis[ni][nj][nk]= v;
Q.push(Node(ni, nj, nk));
}
}
}
return -1;
}
int main(int argc, char const *argv[])
{
memset(du[0], '#', sizeof(du[0]));
while (~scanf("%d %d %d", &l, &r, &c) && l){
for (int i= 1; i<= l; ++i){
memset(du[i][0], '#', sizeof(du[i][0]));
memset(du[i][r+1], '#', sizeof(du[i][r+1]));
for (int j= 1; j<= r; ++j){
scanf(" %s", du[i][j]+1);
for (int k= 1; k<= c; ++k){
if ('S'== du[i][j][k]){
si= i;
sj= j;
sk= k;
break;
}
}
du[i][j][0]= du[i][j][c+1]= '#';
}
}
memset(du[l+1], '#', sizeof(du[l+1]));
int ans= BFS();
if (-1== ans){
printf("Trapped!
");
}
else{
printf("Escaped in %d minute(s).
", ans);
}
}
return 0;
}