| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 16178 | Accepted: 6268 |
Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
3维的迷宫,只需要加上上下两个方向就行了,其他的就是简单的bfs。
开始就是在判断那个进队的if语句中。。应该是map[xx][yy][zz]!=‘#‘, 开始写成了map[xx][yy][zz]==‘.‘;所以害我调了一会。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 105;
char map[N][N][N];
int vist[N][N][N];
struct node
{
int x;
int y;
int z;
int num;
};
queue<node>q;
int dx[]={1,-1,0,0,0,0};
int dy[]={0,0,0,0,-1,1};
int dz[]={0,0,-1,1,0,0};
int flag;
int t, n, m;
int xx, yy, zz;
void bfs()
{
flag = 0;
while( !q.empty() )
{
node temp = q.front();
//cout<<map[temp.x][temp.y][temp.z]<<" ";
//printf( "%d %d %d\n", temp.x, temp.y, temp.z );
if( map[temp.x][temp.y][temp.z]=='E' )
{
printf("Escaped in %d minute(s).\n", temp.num);
flag = 1;
//printf("1\n");
break;
}
q.pop();
for( int i=0; i<6; i++ )
{
xx = temp.x + dx[i];
yy = temp.y + dy[i];
zz = temp.z + dz[i];
//printf( "%d %d %d\n" ,xx,yy,zz);
if( xx>=1 && xx<=t && yy>=1 && yy<=n &&zz>=1 && zz<=m && !vist[xx][yy][zz] && map[xx][yy][zz]!='#' )
{
node next;
next.x = xx; next.y = yy; next.z = zz; next.num = temp.num+1;
//printf( "%d %d %d\n", xx, yy, zz );
vist[xx][yy][zz] = true;
q.push( next );
}
}
}
if( !flag )
printf("Trapped!\n");
}
int main()
{
while( scanf("%d%d%d", &t, &n, &m) &&t &&n &&m )
{
node frist;
while( !q.empty() ) q.pop();
memset( vist, false, sizeof( vist ) );
for(int i=1; i<=t; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=m; k++)
{
cin>>map[i][j][k];
if( map[i][j][k]=='S' )
{
frist.x = i;
frist.y = j;
frist.z = k;
}
}
frist.num=0;
vist[frist.x][frist.y][frist.z] = true;
q.push( frist );
bfs();
}
return 0;
}
POJ 2251:Dungeon Master(三维BFS),布布扣,bubuko.com
POJ 2251:Dungeon Master(三维BFS)
原文地址:http://blog.csdn.net/u013487051/article/details/37901353