python算法题——搜索篇 Poj2251

地下城大师

描述

你被 困在一个3D地牢里,需要找到最快的出路!地牢由单位立方体组成,这些立方体可能会也可能不会充满岩石。将一个单元向北、向南、向东、向西、向上或向下移动需要一分钟。你不能对角线移动,迷宫四面都是坚硬的岩石。

逃脱可能吗?如果是,需要多长时间?

输入

输入由许多地牢组成。每个地牢描述都以包含三个整数 L、R 和 C 的行开头(大小限制为 30)。 L是构成地牢的关卡数。 R 和 C 是构成每个级别计划的行数和列数。 然后接下来是 L 个 R 行块,每个块都包含 C 字符。每个角色描述地牢的一个牢房。充满岩石的单元格由“#”表示,空单元格由“.”表示。您的起始位置由“S”表示,退出位置由字母“E”表示。每个级别后都有一个空白行。输入由 L、R 和 C 的三个零终止。

输出

如果能够出逃,print Escaped in x minute(s).

不能,print Trapped!

思路,这是一个三维的迷宫

打表:

dx = [1, -1, 0, 0, 0, 0]
​
dy = [0, 0, 1, -1, 0, 0]
​
dz = [0, 0, 0, 0, 1, -1]

接受输入代码

L, R, C = map(int, input().split())

S:表示Start

E:表示End

接下来需要接收每一层的输入,可以采用三维数组

maps = [[[0 for i in range(L)]for i in range(R)]for i in range(C)]
​
for i in range(L):
    for j in range(R + 1):
        maps[i][j] = input()
        for k in range(C):
            if j == R:
                continue #输入空格时,不能去检测SE会越界
            if maps[i][j][k] == "S":
                s1 = i
                s2 = j
                s3 = k
            if maps[i][j][k] == "E":
                e1 = i
                e2 = j
                e3 = k
#由于输入每层后面都会加一行空行,因此需要将forj的地方加上1

Sample Input

3 4 5
S....
.###.
.##..
###.#
​
#####
#####
##.##
##...
​
#####
#####
#.###
####E

Sample Output

Escaped in 11 minute(s).

反正poj的python也提交不了,我就干脆只写一个迷宫的输入了

考虑用bfs还是dfs写,用bfs写:

class node:
    def __init__(self, x, y, z, ti):
        self.x = x
        self.y = y
        self.z = z
        self.ti = ti
​
import queue
​
q = queue.Queue()
temp = node(s1, s2, s3, 1)
q.put(temp)
visited = [[[0 for i in range(C)] for i in range(R)] for i in range(L)]
visited[s1][s2][s3] = 1
flag = 0
while not q.empty():
    t = q.get()
    for i in range(6): #这里是6,0~5的范围,找了半天居然没找到也是服了
        x0 = t.x + dx[i]
        y0 = t.y + dy[i]
        z0 = t.z + dz[i]
        if x0 < 0 or y0 < 0 or z0 < 0:
            continue
        if x0 >= L or y0 >= R or z0 >= C:
            continue
        if maps[x0][y0][z0] == '#':
            continue
        if visited[x0][y0][z0] == 1:
            continue
        if maps[x0][y0][z0] == 'E':
            print("Escaped in " + str(t.ti) + " minute(s)")
            flag = 1
            break
        visited[x0][y0][z0] = 1
        s = node(x0, y0, z0, t.ti + 1)
        q.put(s)
if flag == 0:
    print("Trapped")

完整代码展示:

if __name__ == '__main__':
    class node:
        def __init__(self, x, y, z, ti):
            self.x = x
            self.y = y
            self.z = z
            self.ti = ti
​
    dx = [1, -1, 0, 0, 0, 0]
​
    dy = [0, 0, 1, -1, 0, 0]
​
    dz = [0, 0, 0, 0, 1, -1]
​
    L, R, C = map(int, input().split())
​
    maps = [[[0 for i in range(C)] for i in range(R + 1)] for i in range(L)]
​
    for i in range(L):
        for j in range(R + 1):
            maps[i][j] = input()
            for k in range(C):
                if j == R:
                    continue
                if maps[i][j][k] == "S":
                    s1 = i
                    s2 = j
                    s3 = k
                if maps[i][j][k] == "E":
                    e1 = i
                    e2 = j
                    e3 = k
​
​
import queue
​
q = queue.Queue()
temp = node(s1, s2, s3, 1)
q.put(temp)
flag = 0
visited = [[[0 for i in range(C)] for i in range(R + 1)] for i in range(L)]
visited[s1][s2][s3] = 1
while not q.empty():
    t = q.get()
    for i in range(6):
        x0 = t.x + dx[i]
        y0 = t.y + dy[i]
        z0 = t.z + dz[i]
        if x0 < 0 or y0 < 0 or z0 < 0:
            continue
        if x0 >= L or y0 >= R or z0 >= C:
            continue
        if maps[x0][y0][z0] == '#':
            continue
        if visited[x0][y0][z0] == 1:
            continue
        if maps[x0][y0][z0] == 'E':
            print("Escaped in " + str(t.ti) + " minute(s)")
            flag = 1
            break
        visited[x0][y0][z0] = 1
        s = node(x0, y0, z0, t.ti + 1)
        q.put(s)
if flag == 0:
    print("Trapped")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值