地下城大师
描述
你被 困在一个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")