【POJ - 2251】Dungeon Master (bfs+优先队列)

Dungeon Master

直接上中文了

 Descriptions:

你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体单位中有的会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能向对角线的四个方向移动且迷宫四周环绕着许多岩石。 

是否可以逃出地牢?如果可以,则需要多少时间? 

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!

题目链接:

https://vjudge.net/problem/POJ-2251

 

最短路bfs,和二维的基本一样,就是原来4个方向,现在6个方向,原来数组是二维,现在是三维,也相当于模板题了

AC代码

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define mod 1000000007
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int sl,sx,sy;
int el,ex,ey;
char mp[35][35][35];//记录地图
int vis[35][35][35];//标记是否走过
int base[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };//六个方向
int l,r,c;
struct node
{
    int f,x,y;//位置
    int step;//步数
    friend bool operator<(node a,node b)//步数小的现出来,即时间少
    {
        return a.step>b.step;//优先队列,步数小的先访问
    }
};
priority_queue<node>q;
/*************************bfs***************************/
void bfs()
{
    node p;
    p.f=sl;//初始化
    p.x=sx;
    p.y=sy;
    p.step=0;
    vis[sl][sx][sy]=1;
    q.push(p);
    while(!q.empty())
    {
        node s=q.top();
        q.pop();
        if(s.f==el&&s.x==ex&&s.y==ey)//满足条件
        {
            printf("Escaped in %d minute(s).\n",s.step);
            return;
        }
            for(int i=0; i<6; i++)//6种走法
            {
                int tl=s.f+base[i][0];
                int tx=s.x+base[i][1];
                int ty=s.y+base[i][2];
                if(mp[tl][tx][ty]!='#'&&tl>=0&&tl<l&&tx>=0&&tx<r&&ty>=0&&ty<c&&!vis[tl][tx][ty])//判断是否能走
                {
                    node e;
                    e.f=tl;
                    e.x=tx;
                    e.y=ty;
                    e.step=s.step+1;
                    vis[e.f][e.x][e.y]=1;
                    q.push(e);
                }
            }
    }
    cout<<"Trapped!"<<endl;
}
/**********************************主函数*********************************/
int main()
{
    while(cin >> l >> r >>c,l+r+c)
    {
        for(int i=0; i<l; i++)
        {
            for(int j=0; j<r; j++)
            {
                cin >> mp[i][j];
                for(int k=0; k<c; k++)
                {
                    if(mp[i][j][k]=='S')
                        {
                            sl=i;
                            sx=j;
                            sy=k;
                        }
                    if(mp[i][j][k]=='E')
                    {
                        el=i;
                        ex=j;
                        ey=k;
                    }
                }
            }
        }
        memset(vis,0,sizeof(vis));//每次都要初始化
        bfs();
    }
}

 

posted on 2019-06-02 16:55  Sky丨Star  阅读(2028)  评论(1编辑  收藏  举报

导航