刚开始忘记将搜过的点标记为0了,会MLE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <cstdio>
#include <queue>
using namespace std;

int L,R,C;
int zz,xx,yy;
int maxx;
int c[35][35][35];
bool vis[35][35][35];
int des[7][3] = {{0,0,0},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};
struct p {
int z;
int x;
int y;
int sum;
};
queue<p>q;

bool check(p pq) {
if(vis[pq.z][pq.x][pq.y] == 1 && pq.x <= R && pq.x >= 1 && pq.y <= C && pq.y >= 1 && pq.z >= 1 && pq.z <= L) {
return 1;
} else
return 0;
}

void bfs() {
while(!q.empty()) {
p ppp;
p pp = q.front();
q.pop();
if(pp.x == xx && pp.y == yy && pp.z == zz) {
maxx = pp.sum;
return;
}
for(int i = 1 ; i <= 6 ; i++) {
ppp.z = pp.z + des[i][0];
ppp.x = pp.x + des[i][1];
ppp.y = pp.y + des[i][2];
ppp.sum = pp.sum + 1;
if(check(ppp) == 1) {
q.push(ppp);
vis[ppp.z][ppp.x][ppp.y] = 0;
}
}
}
return ;
}

int main() {
while(scanf("%d %d %d",&L,&R,&C)!=EOF && (L''R''C)) {
maxx = 10000;
getchar();
for(int k = 1; k <= L ; k++) {
for(int i = 1; i <= R ; i++) {
for(int j = 1 ; j <= C ; j++) {
scanf("%c",&c[k][i][j]);
if(c[k][i][j] == 'S') {
p pp;
pp.x = i;
pp.y = j;
pp.z = k;
pp.sum = 0;
q.push(pp);
c[k][i][j] = '.';
}
if(c[k][i][j] == 'E') {
c[k][i][j] = '.';
zz = k;
xx = i;
yy = j;
}
if(c[k][i][j] == '.') {
vis[k][i][j] = 1;
} else
vis[k][i][j] = 0;
}
getchar();
}
getchar();
}
bfs();
while(!q.empty()) {
q.pop();
}

printf(maxx == 10000?"Trapped!\n":"Escaped in %d minute(s).\n",maxx);

}
return 0;
}