三维空间的广搜, 与二维一样处理,注意细节就可以
#include <cstdio>
int dx[] = {0, -1, 1, 0, 0, 0, 0};
int dy[] = {0, 0, 0, -1, 1, 0, 0};
int dz[] = {0, 0, 0, 0, 0, -1, 1};
const int inf = 99999999;
char maze[35][35][35], s[35];
int d[35][35][35], q[30000];
int l, r, c;
void bfs(int x, int y, int z)
{
int front, rear, u;
int ans = inf;
front = rear = 1;
u = (z-1)*(r*c) + (x-1)*c + y;
q[rear++] = u;
d[z][x][y] = 0;
while(front < rear)
{
u = q[front++];
z = (u-1)/(r*c) + 1;
u = (u-1)%(r*c) + 1;
x = (u-1)/c + 1;
y = (u-1)%c + 1;
if(maze[z][x][y] == 'E')
{
ans = d[z][x][y];
break;
}
for(int i=1; i<=6; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
int nz = z + dz[i];
if(maze[nz][nx][ny] != '#' && d[nz][nx][ny] == inf)
{
u = (nz-1)*(r*c) + (nx-1)*c + ny;
q[rear++] = u;
d[nz][nx][ny] = d[z][x][y] + 1;
}
}
}
if(ans == inf)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n", ans);
return;
}
int main()
{
while(scanf("%d %d %d",&l, &r, &c), l, r, c)
{
getchar();
int sx, sy, sz;
for(int k=0; k<=l+1; k++)
for(int i=0; i<=r+1; i++)
for(int j=0; j<=c+1; j++)
{
d[k][i][j] = inf;
maze[k][i][j] = '#';
}
for(int k=1; k<=l; k++)
{
for(int i=1; i<=r; i++)
{
scanf("%s", s);
for(int j=1; j<=c; j++)
{
maze[k][i][j] = s[j-1];
if(s[j-1] == 'S')
{
sx = i;
sy = j;
sz = k;
}
}
}
getchar();
}
bfs(sx, sy, sz);
}
return 0;
}