洛谷 p2360地下城主 python 题解

题目描述

你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务。地牢由若干层组成,每一层的形状都是长宽一样的矩形,地牢被分成了若干小格,当小格没有被岩石所占据时,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格。每走一小格花费一分钟时间。

你能不能顺利的从地牢里面逃出来呢?如果可以,那所需要的最短时间又是多少呢?

//据说出口藏有神器。

输入格式

第一行输入L R C(L为地牢的层数,R为每层小格的行数,C为每层小格的列数,其中1<=L,R,C<=30)。

第二行开始输入L层地牢的格局,每一层有R行,每行有C个小格,两层地牢中间有空行隔开。

输入的文件中,“S”代表你的起始点,“E”代表你所要到达的出口,“#”为小格被岩石占据,“.”表示没有被岩石占据。

输出格式

输出包含一行,当你可以顺利到达出口时请输出:

“Escaped in x minute(s).”,x代表你所花费的最短时间;

否则请输出:“Trapped!”。

输入输出样例

输入 #1复制

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

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

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

题目分析

常规的迷宫题只不过有原先的两维扩展为三维,bfs依旧能行。

代码

if __name__ == "__main__":
    L, R, C = map(int, input().split(' '))  # 层行列
    m = [[] for _ in range(L)]  # 地图 二维数组 层和行 字符串的序号就为列
    s = [0 for _ in range(4)]  # 起始点

    for i in range(L):  # 输入地图
        for j in range(R):
            step = input()
            if "S" in step:
                s[0] = i
                s[1] = j
                s[2] = step.index("S")
            m[i].append(step)
        if i != L - 1:
            input()

    direction = [[1, 0, 0, 1], [-1, 0, 0, 1], [0, 1, 0, 1], [0, -1, 0, 1], [0, 0, 1, 1], [0, 0, -1, 1]]  # 六个方向
    # 第四个数表示下一步增加的时间


    def BFS():
        p = [s]  # 起点入列
        vis = [[[0 for _ in range(C)] for _ in range(R)] for _ in range(L)]
        while p:
            now = p.pop(0)  # 队列,先进先出
            vis[now[0]][now[1]][now[2]] = 1  # 弹出即标记
            if m[now[0]][now[1]][now[2]] == 'E':  # 判断是否找到终点
                return now[3]
            for d in range(6):
                next_p = [a + b for a, b in zip(now, direction[d])]  # 下一步的探测点
                if next_p[0] not in range(L) or next_p[1] not in range(R) or next_p[2] not in range(C):
                    continue
                elif vis[next_p[0]][next_p[1]][next_p[2]] == 1:
                    continue
                elif m[next_p[0]][next_p[1]][next_p[2]] == '#':
                    continue
                else:
                    p.append(next_p)  # 添加下一个可行点
        return -1  # p都遍历完了还没有返回,则返回0


    bfs = BFS()
    if bfs == -1:
        print("Trapped")
    else:
        print('Escaped in %d minute(s).' % bfs)

        样例必过!!!

        我就搞不明白了,这也WRONG ANSWER一个,吐了。但是我是真的看不明白了,等大哥告诉我咯。

        注意,那个循环用的列表采用队列样式的输出。前进先出,如果是后进先出的话,就不是bfs了。一开始我没注意,只通过了两个测试点,改了后共对了四个。还是差一个,tnnd我就想不明白了,思路没错呀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值