UVA532 Dungeon Master

news/2024/7/1 23:19:12

问题链接:UVA532 Dungeon Master。

题意简述:三维空间地牢(迷宫),每个点由'.'(可以经过)、'#'(墙)、'S'(起点)和'E'(终点)组成。移动方向有上、下、左、右、前和后6个方向。每移动一次耗费1分钟,求从'S'到'E'最快走出时间。不同L层,相同RC处是连通的。

问题分析:一个三维迷宫,典型的BFS问题。在BFS搜索过程中,走过的点就不必再走了,因为这次再走下去不可能比上次的步数少。

程序中,使用了一个队列来存放中间节点,但是每次用完需要清空。需要注意的一点,为了编程方便,终点'E'置为'.'。

需要说明的一点,用C++语言的输入比起C语言的输入,程序简洁方便。

AC的C++语言程序如下:

/* UVA532 Dungeon Master */

#include <iostream>
#include <queue>

using namespace std;

const int DIRECTSIZE = 6;
struct direct {
    int dx;
    int dy;
    int dz;
} direct[DIRECTSIZE] =
    {{-1, 0, 0}, {1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {0, 0, -1}, {0, 0, 1}};

const int MAXN = 50;
char cube[MAXN][MAXN][MAXN];

struct node {
    int x, y, z, level;
};

int L, R, C;
node start, e2;
int ans;

void bfs()
{
    queue<node> q;

    ans = -1;
    q.push(start);

    while(!q.empty()) {
        node front = q.front();
        q.pop();

        if(front.x == e2.x && front.y == e2.y && front.z == e2.z) {
            ans = front.level;
            break;
        }

        for(int i=0; i<DIRECTSIZE; i++) {
            int nextx, nexty, nextz;

            nextx = front.x + direct[i].dx;
            if(0 > nextx || nextx >= L)
                continue;
            nexty = front.y + direct[i].dy;
            if(0 > nexty || nexty >= R)
                continue;
            nextz = front.z + direct[i].dz;
            if(0 > nextz || nextz >= C)
                continue;

            if(cube[nextx][nexty][nextz] == '.') {
                cube[nextx][nexty][nextz] = '#';

                node v;
                v.x = nextx;
                v.y = nexty;
                v.z = nextz;
                v.level = front.level + 1;
                q.push(v);
            }
        }
    }
}

int main()
{
    int i, j, k;
    char c;

    while(cin >> L >> R >> C) {
        if(L == 0 && R == 0 && C == 0)
            break;

        for(i=0; i<L; i++) {
            for(j=0; j<R; j++) {
                for(k=0; k<C; k++) {
                    cin >> c;

                    cube[i][j][k] = c;
                    if(c == 'S') {
                        start.x = i;
                        start.y = j;
                        start.z = k;
                        start.level = 0;
                    } else if(c == 'E') {
                        e2.x = i;
                        e2.y = j;
                        e2.z = k;
                        cube[i][j][k] = '.';
                    }
                }
            }
        }

        bfs();

        if(ans == -1)
            cout << "Trapped!\n";
        else
            cout << "Escaped in "<< ans << " minute(s)." << endl;
    }

    return 0;
}




转载于:https://www.cnblogs.com/tigerisland/p/7564452.html


http://www.niftyadmin.cn/n/4085538.html

相关文章

[PC]PHPCMS二次开发指南(上)

------------------------------------------------------------------------------------- PHPCMS本身功能已经很完善&#xff0c;自带的模块可用可不用&#xff0c;松耦合特性使其非常适合企业的二次开发。 PC的默认路由在 phpcms/caches/configs/route.php 中定义&#xff0…

基于单片机的智能手表系统设计_【毕设狗】【单片机毕业设计】基于单片机的室内空气质量检测系统的设计...

前一段时间&#xff0c;做了一个关于基于单片机的室内空气质量检测系统的设计资料下载地址&#xff1a;基于单片机的室内空气质量检测系统的设计-毕设狗​www.bsdog.cn软件安装&#xff1a;① Keil&#xff1a;Keil uvision5 MDK RM v5.29​www.bsdog.cn② Proteus8.8&#xff…

dex是什么的缩写_游戏中的STR CON、 INT、DEX是什么意思?

展开全部1、STR(力量、物理攻击)在游戏中&#xff0c;物理攻击是以拿着钝器、锐器类的器攻击&#xff0c;一切都以为量为主。它是不同于魔法636f70793231313335323631343130323136353331333431353863攻击的一种攻击手段。物理攻击是指由力改变物体的运动状态从而使被攻击物体发…

大学物理上册详细笔记_复旦学霸们是如何做笔记的?清晰严谨的构图,可爱有趣的手绘...再看看你的......

别人家的笔记字迹优美、布局整齐、配图用心赏心悦目、堪比教科书我的笔记...只有自己看得懂复旦大学学生会组织了一场网课笔记大赛收集了几十份复旦学霸们的笔记让我们一起来欣赏下&#xff01;局部解剖学笔记记笔记的“李书琪”同学说&#xff1a;局部解剖学本来就很难了&…

python类的定义与使用_Python每日一题:类的定义和装饰器@classmethod与@staticmethod...

python中的定义类方法有三种形式普通方法类方法(classmethod)静态方法(staticmethod)1、普通方法的使用class A(): def __init__(self, name, age): self.name name self.age age def get_name(self): print(my name is, self.name) def get_age(self): print(fi am {self.ag…

linux windows文件 编码_Linux 下查看文件字符编码和转换编码

Linux 下查看文件字符编码和转换编码 如果你需要在 Linux 中操作 windows 下的文件&#xff0c;那么你可能会经常遇 到 文 件 编 码 转 换 的 问 题 。 Windows 中 默 认 的 文 件 格 式 是 GBK(gb2312)&#xff0c;而 Linux 一般都是 UTF-8。下面介绍一下&#xff0c;在 Lin…

软件工程学习要点

背景&#xff1a;学习了软件工程&#xff0c;但不知道要具体学习到一个什么样的程度&#xff0c;后来请教了高人&#xff0c;得到了一些基本的掌握内容&#xff0c;写出来与大家交流&#xff0c;更方便自己之后的复习。 知识掌握类&#xff1a; 软件工程三问&#xff1a;软件工…

少儿编程软件python_一款儿童编程入门的理想工具——PythonTurtle

今天偶然发现了一款Python入门的理想工具PythonTurtle。非常容易上手&#xff0c;强烈推荐一下。PythonTurtle的灵感来源于早期编程语言Logo&#xff0c;也是通过控制小海龟来完成Python语言的入门学习。它致力于降级该编程语言的学习难度&#xff0c;专门为初学者和孩子们设计…