题目:三维的地图中找到S到E得最短路。
分析:搜索,最短路。bfs即可。
注意:连续的if(无else)嵌套会CE。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
char Maps[32][32][32];
int used[32][32][32];
int d[6][3] = {0,0,1,0,0,-1,0,1,0,0,-1,0,1,0,0,-1,0,0};
struct dnode {
int x,y,z,s;
dnode(){}
dnode( int X, int Y, int Z, int S ) {
x = X;y = Y;z = Z;s = S;
}
}Q[30000];
int bfs( int L, int M, int N )
{
dnode S,E;
for ( int i = 0 ; i < L ; ++ i )
for ( int j = 0 ; j < M ; ++ j )
for ( int k = 0 ; k < N ; ++ k ) {
if ( Maps[i][j][k] == 'S' )
S = dnode( i, j, k, 0 );
if ( Maps[i][j][k] == 'E' )
E = dnode( i, j, k, 0 );
used[i][j][k] = 30000;
}
int move = 0,save = 0;
Q[save ++] = S;
used[S.x][S.y][S.z] = 0;
while ( move < save ) {
dnode New,now = Q[move ++];
for ( int i = 0 ; i < 6 ; ++ i ) {
New.x = now.x + d[i][0];
New.y = now.y + d[i][1];
New.z = now.z + d[i][2];
New.s = now.s + 1;
if ( New.x >= 0 && New.x < L && New.y >= 0 && New.y < M &&
New.z >= 0 && New.z < N && Maps[New.x][New.y][New.z] != '#' )
if ( used[New.x][New.y][New.z] > used[now.x][now.y][now.z] + 1 ) {
used[New.x][New.y][New.z] = used[now.x][now.y][now.z] + 1;
Q[save ++] = New;
if ( New.x == E.x && New.y == E.y && New.z == E.z )
return New.s;
}
}
}
return -1;
}
int main()
{
int L,M,N;
while ( cin >> L >> M >> N && L+M+N ) {
for ( int i = 0 ; i < L ; ++ i )
for ( int j = 0 ; j < M ; ++ j )
cin >> Maps[i][j];
int value = bfs( L, M, N );
if ( value != -1 )
printf("Escaped in %d minute(s).\n",value);
else printf("Trapped!\n");
}
return 0;
}