poj2251

简单题

View Code
   
     
#include < iostream >
#include
< cstdio >
#include
< cstdlib >
#include
< cstring >
using namespace std;

#define maxn 35

struct Point
{
int x, y, z;
} s, e;

int dir[ 6 ][ 3 ] =
{
{
1 , 0 , 0 },
{
- 1 , 0 , 0 },
{
0 , 1 , 0 },
{
0 , - 1 , 0 },
{
0 , 0 , 1 },
{
0 , 0 , - 1 } };
bool map[maxn][maxn][maxn];
int dist[maxn][maxn][maxn];
Point q[maxn
* maxn * maxn];
int front, rear;
int nx, ny, nz;

void input()
{
memset(map,
0 , sizeof (map));
getchar();
for ( int i = 0 ; i < nz; i ++ )
{
for ( int j = 0 ; j < nx; j ++ )
{
for ( int k = 0 ; k < ny; k ++ )
{
char ch = getchar();
if (ch == ' # ' )
map[j][k][i]
= false ;
else
map[j][k][i]
= true ;
if (ch == ' S ' )
{
s.z
= i;
s.x
= j;
s.y
= k;
}
if (ch == ' E ' )
{
e.z
= i;
e.x
= j;
e.y
= k;
}
}
getchar();
}
getchar();
}
}

bool check( int x, int y, int z)
{
if (x < 0 || y < 0 || z < 0 || x >= nx || y >= ny || z >= nz)
return false ;
if (dist[x][y][z] != - 1 )
return false ;
return map[x][y][z];
}

int bfs()
{
memset(dist,
- 1 , sizeof (dist));
front
= 0 ;
rear
= 1 ;
q[
0 ] = s;
dist[s.x][s.y][s.z]
= 0 ;
while (front != rear)
{
Point a
= q[front ++ ];
if (front == maxn * maxn * maxn)
front
= 0 ;
for ( int i = 0 ; i < 6 ; i ++ )
{
int x = dir[i][ 0 ] + a.x;
int y = dir[i][ 1 ] + a.y;
int z = dir[i][ 2 ] + a.z;
if (check(x, y, z))
{
q[rear].x
= x;
q[rear].y
= y;
q[rear
++ ].z = z;
if (rear == maxn * maxn * maxn)
rear
= 0 ;
dist[x][y][z]
= dist[a.x][a.y][a.z] + 1 ;
if (x == e.x && y == e.y && z == e.z)
return dist[x][y][z];
}
}
}
return - 1 ;
}

int main()
{
// freopen("t.txt", "r", stdin);
while (scanf( " %d%d%d " , & nz, & nx, & ny), nx | ny | nz)
{
input();
int ans = bfs();
if (ans == - 1 )
printf(
" Trapped!\n " );
else
printf(
" Escaped in %d minute(s).\n " , ans);
}
return 0 ;
}

你可能感兴趣的:(poj)