[POJ-2251]Dungeon Master
题目描述
XHK被困在一个三维的地牢中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
Input
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。L表示空间的高度。R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层空间后都有一个空行。L,R和C均为0时输入结束。
Output
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
题目分析:
bfs模板题。只不过从二维数组改成了三维数组而已。其他见代码注释。
AC代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int N = 50;
typedef struct node
{
int first;
int second;
int third;
} PO;
queue<PO> q;//定义一个结构体队列存点
int n,m,k,x1,y1,z1,x2,y2,z2;
char g[N][N][N];;
int d[N][N][N];
int bfs(int x1,int y1,int z1)
{
memset(d,-1,sizeof d);//初始所有距离原点的点全部设置为无穷大
PO e;
e.first = x1,e.second = y1,e.third = z1;
q.push(e);//出发点入队进行拓展
d[x1][y1][z1] = 0;//出发点距离设置为0
int dx[] = {0,1,0,-1,0,0},dy[] = {1,0,-1,0,0,0},dz[] = {0,0,0,0,1,-1};//拓展操作可以直接定义数组来进行拓展
while(!q.empty())
{
PO t = q.front();
q.pop();
for(int i = 0;i<6;i++)
{
int x = t.first + dx[i],y = t.second + dy[i],z = t.third + dz[i];
if(x>=0&&y>=0&&z>=0&&x<k&&y<m&&z<n&&(g[x][y][z] == '.'||g[x][y][z] == 'E')&&d[x][y][z] == -1)//这里要特别注意已经出队的点不能再入队了,入队的都是从未入队过的点,所以加了句距离都为-1才进行入队操作
{
PO p;
p.first = x,p.second = y,p.third = z;
q.push(p);
d[x][y][z] = d[t.first][t.second][t.third] +1;
}
}
}//只要队列不为空就进行拓展
return d[x2][y2][z2];
}
int main()
{
while(1)
{
cin>>n>>m>>k;
if(n == 0&&m == 0&&k == 0) break;
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
for(int b = 0;b<k;b++)
{
cin>>g[b][j][i];
if(g[b][j][i] == 'S') x1 = b,y1 = j,z1 = i;
if(g[b][j][i] == 'E') x2 = b,y2 = j,z2 = i;
}
int a = bfs(x1,y1,z1);
if(a == -1)
printf("Trapped!");
else
printf("Escaped in %d minute(s).",a);
puts("");
/*for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
for(int b = 0;b<k;b++)
{
cout<<d[b][j][i]<<' ';
}
puts("");
}
puts("");
}*/
}
return 0;
}

浙公网安备 33010602011771号