Dungeon Master(bfs)广度优先搜索

描述

You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonally and the maze is surrounded by solid rock on all sides.

Is an escape possible? If yes, how long will it take?

输入

The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a ‘#’ and empty cells are represented by a ‘.’. Your starting position is indicated by ‘S’ and the exit by the letter ‘E’. There’s a single blank line after each level. Input is terminated by three zeroes for L, R and C.

输出

Each maze generates one line of output. If it is possible to reach the exit, print a line of the form
Escaped in x minute(s).

where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!

样例输入

3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

样例输出

Escaped in 11 minute(s).
Trapped!

一定要清空队列清空队列清空队列!!!
就是个三维迷宫,没做过二维的话建议先去刷一下二维。
其实这个题没有什么坑点

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#define maxn 1000000
const int MaxN=0x3f3f3f3f;
const int MinN=0xc0c0c00c;
typedef long long ll;
using namespace std;
char a[40][40][40];
int cnt ,num,n,k;
bool visited[40][40][40];
struct wazxy{
    int x,y,z;
    int steps;
};
queue <wazxy>  q;
int dx[6]={0,0,0,0,-1,1};
int dy[6]={0,-1,0,1,0,0};
int dz[6]={1,0,-1,0,0,0};//表示六个方向
wazxy node,temp;
int ans=0;
void bfs(int x,int y,int z,int steps){
    node.x=x,node.y=y,node.z=z,node.steps=steps;
    q.push(node);
    while(!q.empty()){   //基本的bfs操作
        temp=q.front();
        q.pop();
        if(a[temp.x][temp.y][temp.z]=='E'){
            ans=temp.steps;
            break ;
        }
        for(int i=0;i<6;i++){
            node.x=temp.x+dx[i];
            node.y=temp.y+dy[i];
            node.z=temp.z+dz[i];
            if(visited[node.x][node.y][node.z]&&(a[node.x][node.y][node.z]=='.'||a[node.x][node.y][node.z]=='E')){   //判断下一个点是否可以走
                visited[node.x][node.y][node.z]=false;  //一定不要忘记去重
                node.steps=temp.steps+1;
                q.push(node);
            }
        }
    }
    return ;
}
int main()
{
    int n,m,k;
    while(cin>>n>>m>>k){
        if(n==0)  break;
        getchar();
        memset(a,0,sizeof(a));
        while(!q.empty())  q.pop();   //不要忘记清空队列!!!!
        int x,y,z;
        for(int i=1;i<=n;i++)   //都从1开始的话就省去了判断边界这一过程了,我觉得这个方法还是挺实用的
        for(int f=1;f<=m;f++)
        for(int j=1;j<=k;j++){
            cin>>a[i][f][j];
            if(a[i][f][j]=='S'){
                x=i,y=f,z=j;
            }
        }
        memset(visited,true,sizeof(visited));
        ans=0;
        bfs(x,y,z,0);
        if(ans==0){
            cout<<"Trapped!"<<endl;
        }
        else  cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
    }
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

拒绝996的悲伤蛙:此贴终结|给路过的牛友分享一下心得👇 实习的时候不要光埋头干活,身边的大佬同事才是真·宝藏人脉!大胆请教他们工作以及职场上的问题以我的经历,我的带教有十几年工作经验,做过运维、后端开发、web测试,现在是高级软测,是行走的避坑指南 我之前纠结要不要学Web测试简历,被他一句话点醒:Web发展成熟,岗位需求在缩,AI对互联网的冲击可能以后架构+开发+测试一人包揽。现在用户更多用的是移动端APP/小程序,相比之下天天守着电脑刷网页的人基数小。 这里我的纠结得到反馈,于是我又把简历发给带教,获得了一对一的简历指导。 感兴趣的可以看看: 1.教育背景:本科→本科(全日制) 2.实习经历:总体问题不大,但第2点要稍作修改,可以写但做功课,如风机、水箱……可能会问用哪个供应商的?使用寿命、型号、电压电流、多少秒会触发逻辑? 3.项目经历(坑太多,大型翻车现场): - 项目名越直白越好,让人一眼就知道你干了啥。 -用的什么语言设计核心接口,异步执行做功课,涉及线程问题,被问可回答n个功能是如何错开异步执行的 - “验证任务消费……阻塞丢包”“高负载稳定性”这种词,没三五年开发功底不要写,不然面试时被问线程、数量级、CPU占用,内存带宽等影响性能的直接原地社死。 -做功课 -做功课,测了哪些模块,如何设计,接口流量抓包,token,变量…… -做功课,要熟悉网络协议…… 带教之前做互联网开发的时候面试过很多人,总的来说不要为了显得项目高大上过渡包装,写了就要做好拷打的准备
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务