[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;
}
posted @ 2020-03-30 20:36  Trounique  阅读(408)  评论(1)    收藏  举报