POJ 2251 - Dungeon Master + Python实现
原题连接: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实现相关推荐
- POJ 2251 Dungeon Master(三维BFS求最短路径)
3D dungeon 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版][命题人:201506020829][Edit] [TestData] 题 ...
- poj 2251 Dungeon Master (三维bfs)
http://poj.org/problem?id=2251 简单bfs,只不过是三维的... 唯一的坑点在输出上... Escaped in %d minute(s) 这意思是答案为1输出minut ...
- POJ 2251 Dungeon Master
题目链接:https://cn.vjudge.net/problem/POJ-2251 思路:简单BFS,只不过是由二维变成三维. 总结:BFS写起来还是不熟,有点费劲. AC代码: 1 #inclu ...
- POJ 2251 Dungeon Master (BFS最短路)
三维空间里BFS最短路 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #incl ...
- pku 2251 Dungeon Master 基本BFS
用了两种方式, 一种stl队列,一种自己实现的队列,事实证明stl就是好呀. stl万岁. #include <iostream> #include <queue> using ...
- POJ 1253:Dungeon Master
" Ctrl AC!一起 AC!" 题目:忘题戳这 分析:和普通的寻路一样,只要把地图的二维数组变成三维就可以 建议先做一下二维寻路再来写这题:参考博客某二维寻路题解 AC代码: ...
- (POJ - 2251)Dungeon Master(bfs)
题目链接:2251 -- Dungeon Master (poj.org) 这是一个典型的bfs迷宫问题,只不过是三维的,唯一需要注意的就是输入要用cin,不要用scanf,因为有换行,其他没什么了, ...
- Dungeon Master 地下城大师(BFS进阶)
题目链接:2251 -- Dungeon Master 知道你看不懂题(手动滑稽):友情链接. 题意:找到从S到E的最少步数的路径,输出该步数,不过有意思的是这个类似迷宫问题不是二维的,是一个三维迷宫 ...
- B - Dungeon Master POJ - 2251
B - Dungeon Master POJ - 2251 题目: 逃离3D迷宫,n <=30 首先是dfs,算一下最坏情况共30层,每层有30*30的循环, 复杂度 3030*30 显然严重爆 ...
最新文章
- WEB 测试点总结
- golang非对称加密
- 【推荐】极简数独1.0源码
- EClipse开发NDK流程
- @EnableTransactionManagement原理
- 给你的ABAP对象打上标签(Tag)
- 为什么同大取大同小取小_不锈钢马大型动物雕塑-大同金属雕塑马订制
- Android BroadcastReceiver应用
- Java 数字签名原理及产生
- java生命游戏并行_Java架构--线程的发展历史
- GIS应用技巧之利用DEM制作三维立体图
- 青龙面板之【花花阅读】【抖抖健身】
- Buck电路的闭环PI控制
- MySQL读写分离的三种实现方案
- 6行代码生成全部6位数字密码字典
- oem和odm是什么意思?oem与odm区别是什么?
- 面包屑导航 java_jquery 面包屑导航 具体实现
- css Flex布局第一部分(基础)
- C# 建一个Windows 服务 定时发邮件
- 关于方差、协方差、协方差矩阵的概念及意义
热门文章
- 多媒体计算机技术在教学中的应用,浅谈多媒体计算机技术在教学中的应用
- 佳明手表大数据应用_如何用佳明手表数据化跑步 衡
- MSN多开,MSN多帐号登陆
- 【转载】SAP中与物料BOM有关的表关联
- 基础地理信息术语(a-b-c-d-e-f-g-h-i-k-l-m-n-o-t-u-v-w-x-y-z)
- 任务2 学生成绩信息管理系统
- APEX V2.0 - ANGULAR 5+ BOOTSTRAP 4 HTML ADMIN TEMPLATE启动报错解决办法
- C#绘制带控制点的Bezier曲线,用于点阵图像及矢量图形
- 中式红木装修,中式装修的典范
- ‘gbk‘ codec can‘t decode byte