原题连接:2251 -- Dungeon Master

参考资料:POJ 2251 - Dungeon Master | 眈眈探求

问题:从起点S,经上下左右前后行走,到达目的地E点,返回所经过的路径。(详见原题链接)

输入:

第一行是:层数L,每一层的行数R和列数L,由此构成了一个3D空间;

接下来的L*R行,输入的是相应的Dungeon布局,由#(阻塞)和.(通行),以及起点S和终点E组成;

例如:

注意:

1 有多组三维地图

2 当输入为“0 0 0”时,结束输入

一 本程序功能及思路

1. 代码设计:用于接收键盘输入,当输入是 0 0 0时,结束输入!

2. 代码设计:将每个三维地图转化为一个数组,建立数组元素的索引值与三维坐标(L;R;C)之间的对应关系;

3 思路:将三维坐标(L;R;C)作为地图中各点(视为顶点)的标签,那么可以根据该标签构建连接图,然后通过BFS(广度优先搜索)的基本思路,完成最短路径查找。

二 Python代码实现

import collections## 将索引转化为(xyz)坐标
def sub2Cor(L, R, C, index):#Z坐标L_new = index // (R * C)# print(L_new)# R坐标index_new = index -L_new*(R*C)R_new = index_new//C# print(R_new)# C坐标C_new = index_new - R_new*C# print(C_new)# 坐标LRC = str(L_new) +";"+ str(R_new)+";"+str(C_new)return LRC# 路径数:
def numOFpath(target,parent):V = target;steps = 0while V!=None:V = parent[V]steps +=1return steps -1def bfs(infor,s,target):# 将起始节点加入到队列中queue = []queue.append(s)# 获得字典的键值,用来查找邻点keys = infor.keys() #这里包含了所有的节点;#如果新生成的节点不在keys中,则说明其不是有效的节点# 设置集合,用来存放已访问过的节点visited = set()visited.add(s)# 设置父节点parent = {s:None}while len(queue) >0:# 弹出节点vertex = queue.pop(0)# 查找邻接点,共6个nodes = []nnl,nnr,nnc = map(int,vertex.split(';'))up = str(nnl+1) + ';' + str(nnr) + ';' +str(nnc)nodes.append(up)down = str(nnl - 1) + ';' + str(nnr) + ';' +str(nnc)nodes.append(down)left = str(nnl) + ';' + str(nnr) + ';' +str(nnc-1)nodes.append(left)right = str(nnl) + ';' + str(nnr) + ';' +str(nnc + 1)nodes.append(right)front = str(nnl) + ';' + str(nnr+1) + ';' +str(nnc)nodes.append(front)behind = str(nnl) + ';' + str(nnr + 1) + ';' +str(nnc)nodes.append(behind)for i in nodes:if i not in visited:if i in keys: #如果节点不在keys中,则说明其不是有效的节点if infor[i][1] != '#':# 说明该节点有效# 添加到队列中queue.append(i)# 添加到已访问中visited.add(i)# 设置父节点parent[i] = vertexif i == target:return numOFpath(target,parent)return -1## 迎接输入数据
data = []
data_size = []
while True:L,R,C = map(int,input().strip().split(' '))if L==0 and R==0 and C==0:breakelse:data_size.append(str(L)+";"+str(R)+";"+str(C))temp = []for i in range(L*R+L-1):if (i+1)%(R+1) ==0: # 处理空行输入input()else:temp1 = input().strip()for i in range(C):temp.append(temp1[i])input() # 处理空行输入data.append(temp)
print(data)
print(data_size)# 格式转换,并用字典存储坐标标签和索引值for i in range(len(data)):sub = data[i] # 读取第一组数据nL,nR,nC = map(int,data_size[i].split(';')) # 读取数据尺寸# 创建一个空字典infor = collections.defaultdict(list)# 存储到字典中for j in range(nL*nR*nC):if sub[j] == 'S': #起始节点s = sub2Cor(nL,nR,nC,j);if sub[j] == 'E': #目标节点target = sub2Cor(nL, nR, nC, j);label = sub2Cor(nL,nR,nC,j);infor[label] = [j,sub[j]]# print(infor)# print(s)# print(target)# 接下来,进行bfs搜索ans = bfs(infor,s,target)if ans != -1:print("Escaped in "+ str(ans) + " minute(s).")else:print("Trapped!")

实验测试:

输入:

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

输出:

POJ 2251 - Dungeon Master + Python实现相关推荐

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

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

  2. poj 2251 Dungeon Master (三维bfs)

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

  3. POJ 2251 Dungeon Master

    题目链接:https://cn.vjudge.net/problem/POJ-2251 思路:简单BFS,只不过是由二维变成三维. 总结:BFS写起来还是不熟,有点费劲. AC代码: 1 #inclu ...

  4. POJ 2251 Dungeon Master (BFS最短路)

    三维空间里BFS最短路 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #incl ...

  5. pku 2251 Dungeon Master 基本BFS

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

  6. POJ 1253:Dungeon Master

    " Ctrl AC!一起 AC!" 题目:忘题戳这 分析:和普通的寻路一样,只要把地图的二维数组变成三维就可以 建议先做一下二维寻路再来写这题:参考博客某二维寻路题解 AC代码: ...

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

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

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

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

  9. B - Dungeon Master POJ - 2251

    B - Dungeon Master POJ - 2251 题目: 逃离3D迷宫,n <=30 首先是dfs,算一下最坏情况共30层,每层有30*30的循环, 复杂度 3030*30 显然严重爆 ...

最新文章

  1. WEB 测试点总结
  2. golang非对称加密
  3. 【推荐】极简数独1.0源码
  4. EClipse开发NDK流程
  5. @EnableTransactionManagement原理
  6. 给你的ABAP对象打上标签(Tag)
  7. 为什么同大取大同小取小_不锈钢马大型动物雕塑-大同金属雕塑马订制
  8. Android BroadcastReceiver应用
  9. Java 数字签名原理及产生
  10. java生命游戏并行_Java架构--线程的发展历史
  11. GIS应用技巧之利用DEM制作三维立体图
  12. 青龙面板之【花花阅读】【抖抖健身】
  13. Buck电路的闭环PI控制
  14. MySQL读写分离的三种实现方案
  15. 6行代码生成全部6位数字密码字典
  16. oem和odm是什么意思?oem与odm区别是什么?
  17. 面包屑导航 java_jquery 面包屑导航 具体实现
  18. css Flex布局第一部分(基础)
  19. C# 建一个Windows 服务 定时发邮件
  20. 关于方差、协方差、协方差矩阵的概念及意义

热门文章

  1. 多媒体计算机技术在教学中的应用,浅谈多媒体计算机技术在教学中的应用
  2. 佳明手表大数据应用_如何用佳明手表数据化跑步 衡
  3. MSN多开,MSN多帐号登陆
  4. 【转载】SAP中与物料BOM有关的表关联
  5. 基础地理信息术语(a-b-c-d-e-f-g-h-i-k-l-m-n-o-t-u-v-w-x-y-z)
  6. 任务2 学生成绩信息管理系统
  7. APEX V2.0 - ANGULAR 5+ BOOTSTRAP 4 HTML ADMIN TEMPLATE启动报错解决办法
  8. C#绘制带控制点的Bezier曲线,用于点阵图像及矢量图形
  9. 中式红木装修,中式装修的典范
  10. ‘gbk‘ codec can‘t decode byte