IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> POJ 2251 - Dungeon Master + Python实现 -> 正文阅读

[数据结构与算法]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 = 0
    while V!=None:
        V = parent[V]
        steps +=1
    return steps -1

def dfs(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] = vertex
                        if 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:
        break
    else:
        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 = dfs(infor,s,target)
    if ans != -1:
        print("Escaped in "+ str(ans) + " minute(s).")
    else:
        print("Trapped!")

实验测试:

? ? ? ? 输入:

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

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

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

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

0 0 0

? ? ? ? 输出:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:17:15  更:2021-12-03 13:19:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 6:34:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码