Dungeon Master

  • 题面翻译
  • 题目描述
  • 输入格式
  • 输出格式
  • 样例 #1
    • 样例输入 #1
    • 样例输出 #1
  • 题解思路及TIME EXCEEDED问题
  • 题解
  • 超时题解(个人觉得没问题)

题面翻译

【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。

【输入】
多组测试数据。

一组测试测试数据表示一个三维迷宫:

前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。

【输出】
最小移动次数。

Translated by @剑圣夜雨声烦

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

3 4 5
S....
.###.
.##..
###.######
#####
##.##
##...#####
#####
#.###
####E1 3 3S##
#E#
###0 0 0

样例输出 #1

Escaped in 11 minute(s).
Trapped!

题解思路及TIME EXCEEDED问题

我最开始使用的方法和上一篇文章一样,采用的递归的思想,然而超时了……
所以转而使用循环来解决,超时的算法我就放在最后面了。
暴力搜索的循环写法可以类比图的bfs遍历搜索,使用一个队列来遍历整个图。每遍历到一个节点就把节点入队,遍历完队首所有邻接节点后队首出队。

题解


#include <cstdio>
#include <string.h>
#include <queue>
#include <limits.h>
using namespace std;int l, r, c,mmin;
char map[50][50][50];
int vis[50][50][50];
typedef struct op
{int x;int y;int z;int step;
} point;int judge(int x, int y ,int z)
{if (x < 0 || y < 0 || z < 0 || x >= l || y >= r || z >= c)return 0;if (map[x][y][z] == '#' || vis[x][y][z] == 1)return 0;return 1;
}// 通过遍历矩阵来模拟移动,代码量很小
const int arrx[6] = {0, 0, 0, 0, 1, -1};
const int arry[6] = {0, 0, 1, -1, 0, 0};
const int arrz[6] = {1, -1, 0, 0, 0, 0};
void bfs(int x, int y, int z)
{queue<point> q;point buf;buf.x = x;buf.y = y;buf.z = z;buf.step = 0;q.push(buf);vis[x][y][z] = 1;while (!q.empty()){point cur = q.front();if (map[cur.x][cur.y][cur.z] == 'E'){if (cur.step < mmin){mmin = cur.step;}}q.pop();//模拟移动,好好看好好学for (int i = 0; i < 6; i++){int newx = cur.x + arrx[i];int newy = cur.y + arry[i];int newz = cur.z + arrz[i];if (judge(newx, newy, newz)){buf.x = newx;buf.y = newy;buf.z = newz;buf.step = cur.step + 1;vis[newx][newy][newz] = 1;q.push(buf);}}}return;
}
int main()
{while (scanf("%d %d %d", &l, &r, &c) && l != 0){mmin = INT_MAX;point start;getchar();memset(vis, 0, sizeof(vis));for (int i = 0; i < l; i++){if (i > 0)getchar();for (int j = 0; j < r; j++){for (int k = 0; k < c; k++){scanf("%c", &map[i][j][k]);if (map[i][j][k] == 'S'){start.x = i;start.y = j;start.z = k;}if (k == c - 1){getchar();}}}}// printf("********************\n");// for (int i = 0; i < l; i++)// {//     for (int j = 0; j < r; j++)//     {//         for (int k = 0; k < c; k++)//         {//             printf("%c ", map[i][j][k]);//             if (k == c - 1)//             {//                 printf("\n");//             }//         }//     }// }bfs(start.x, start.y, start.z);if (mmin == INT_MAX){printf("Trapped!\n");}else{printf("Escaped in %d minute(s).\n", mmin);}}return 0;
}

超时题解(个人觉得没问题)

#include <cstdio>
#include <string.h>#include <limits.h>
int count;
int l, r, c;
char map[50][50][50];
int
vis[50][50][50];
typedef struct op
{int x;int y;int z;
} point;
int max;
void dfs(int x, int y, int z)
{if (map[x][y][z] == 'E'){//        printf("i'm out!!\n");if (count < max && count != 0)max = count;return;}if (x - 1 >= 0){if (map[x - 1][y][z] != '#' && vis[x - 1][y][z] == 0){count++;vis[x][y][z] = 1;dfs(x - 1, y, z);vis[x][y][z] = 0;count--;}}if (y - 1 >= 0){if (map[x][y - 1][z] != '#' && vis[x][y - 1][z] == 0){count++;vis[x][y][z] = 1;dfs(x, y - 1, z);vis[x][y][z] = 0;count--;}}if (z - 1 >= 0){if (map[x][y][z - 1] != '#' && vis[x][y][z - 1] == 0){count++;vis[x][y][z] = 1;dfs(x, y, z - 1);vis[x][y][z] = 0;count--;}}if (x + 1 < l){if (map[x + 1][y][z] != '#' && vis[x + 1][y][z] == 0){count++;vis[x][y][z] = 1;dfs(x + 1, y, z);vis[x][y][z] = 0;count--;}}if (y + 1 < r){char buf1 = map[x][y + 1][z];int buf2 = vis[x][y + 1][z];if (map[x][y + 1][z] != '#' && vis[x][y + 1][z] == 0){count++;vis[x][y][z] = 1;dfs(x, y + 1, z);vis[x][y][z] = 0;count--;}}if (z + 1 < c){if (map[x][y][z + 1] != '#' && vis[x][y][z + 1] == 0){count++;vis[x][y][z] = 1;dfs(x, y, z + 1);vis[x][y][z] = 0;count--;}}return;
}
int main()
{while (scanf("%d %d %d", &l, &r, &c) && l != 0){max = INT_MAX;point start;getchar();memset(vis, 0, sizeof(vis));for (int i = 0; i < l; i++){if (i > 0)getchar();for (int j = 0; j < r; j++){for (int k = 0; k < c; k++){scanf("%c", &map[i][j][k]);if (map[i][j][k] == 'S'){start.x = i;start.y = j;start.z = k;}if (k == c - 1){getchar();}}}}//这是用来检查输入是否正确的// printf("********************\n");// for (int i = 0; i < l; i++)// {//     for (int j = 0; j < r; j++)//     {//         for (int k = 0; k < c; k++)//         {//             printf("%c ", map[i][j][k]);//             if (k == c - 1)//             {//                 printf("\n");//             }//         }//     }// }count = 0;dfs(start.x, start.y, start.z);if (max == INT_MAX){printf("Trapped!\n");}else{printf("Escaped in %d minute(s).\n", max);}}return 0;
}

Dungeon Master题解bfs相关推荐

  1. Dungeon Master(poj2251,bfs)

    http://poj.org/problem?id=2251 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=15203 Dun ...

  2. (POJ - 2251)Dungeon Master(bfs)

    题目链接:2251 -- Dungeon Master (poj.org) 这是一个典型的bfs迷宫问题,只不过是三维的,唯一需要注意的就是输入要用cin,不要用scanf,因为有换行,其他没什么了, ...

  3. Dungeon Master(bfs)广度优先搜索

    描述 You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of ...

  4. Dungeon Master 三维BFS

    三维BFS DungeonMasterDungeon\ MasterDungeon Master 跟二维没啥区别,就是方向多了几个,但在写的过程中出的bugbugbug还是蛮多的,所以记录一下吧! # ...

  5. poj 2251 Dungeon Master (三维bfs)

    http://poj.org/problem?id=2251 简单bfs,只不过是三维的... 唯一的坑点在输出上... Escaped in %d minute(s) 这意思是答案为1输出minut ...

  6. pku 2251 Dungeon Master 基本BFS

    用了两种方式, 一种stl队列,一种自己实现的队列,事实证明stl就是好呀. stl万岁. #include <iostream> #include <queue> using ...

  7. poj-2251 Dungeon Master【bfs】

    很基础的一道bfs /*这题是一个三维的迷宫题目,其中用'.'表示空地,'#'表示障碍物,'S'表示起点,'E'表示终点, 求从起点到终点的最小移动次数,解法和二维的类似, 只是在行动时除了东南西北移 ...

  8. POJ 2251 Dungeon Master(三维BFS求最短路径)

    3D dungeon 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版][命题人:201506020829][Edit] [TestData] 题 ...

  9. Dungeon Master 地下城大师(BFS进阶)

    题目链接:2251 -- Dungeon Master 知道你看不懂题(手动滑稽):友情链接. 题意:找到从S到E的最少步数的路径,输出该步数,不过有意思的是这个类似迷宫问题不是二维的,是一个三维迷宫 ...

最新文章

  1. C++ primer 笔记 (一)
  2. 用python画画如何保存_python画图后怎么保存
  3. SAP CRM WebClient UI F4 value help is centrally implemented in CRM_THTMLB_UTIL/F4Frameset.html
  4. leetcode 82. 删除排序链表中的重复元素 II(map)
  5. 飞鸽传书2011帮助文档
  6. java hashset 实现原理_深入Java集合学习系列:HashSet的实现原理
  7. POJ 2455 Secret Milking Machine
  8. Comparator改写
  9. vue 引入外部less_Vue项目中引入外部文件的方法(css、js、less)
  10. .net知识和学习方法系列(十七)CLR-CLR中的值类型和引用类型
  11. 【编程软件】keli自定义跳转函数及返回跳转原位置按键(附赠MDK525版本下载地址)
  12. godot python_godot新手教程2[godot常用代码用法]
  13. How Did Watson Answer? —— Typing Coerced Candidate Answer
  14. 金山词霸2009破解版SP1牛津版完整绿色破解版
  15. sm框架 访问局域网mysql_ssm框架搭建之sm框架整合
  16. maven打包会自动执行test方法,如何skipTests关闭maven自动执行test
  17. 像素(px)与厘米的关系
  18. 【解决方案】医院医疗安防视频监控系统搭建及集成统一管理方案介绍
  19. ubuntu14.04安装搜狗输入法
  20. 计算器并没有取代数学家,AI也不会取代人类

热门文章

  1. 转换工具推荐:如何将PDF文档转换为PPT演示文稿
  2. 最美的十大经典爱情句子{转}
  3. Binary Knapsack (BKP) Problem 是什么
  4. mysql8对系统的要求_linux-mysql8的安装步骤详解及需要注意的坑
  5. win10多用户同时远程桌面登陆(允许多个RDP会话)-支持win10最新1909版2004版
  6. poi excel下载
  7. 硬盘、光驱、刻录机维修技术
  8. 天图投资境外上市获批:上半年营收降​18% 投了小红书与百果园
  9. 提高转化率的 3 个客户引导最佳实践
  10. JS阻止默认行为和Vue阻止默认行为