文章目录
- Question
- Ideas
- Code
Question
你现在被困在一个三维地牢中,需要找到最快脱离的出路!
地牢由若干个单位立方体组成,其中部分不含岩石障碍可以直接通过,部分包含岩石障碍无法通过。
向北,向南,向东,向西,向上或向下移动一个单元距离均需要一分钟。
你不能沿对角线移动,迷宫边界都是坚硬的岩石,你不能走出边界范围。
请问,你有可能逃脱吗?
如果可以,需要多长时间?
输入格式
输入包含多组测试数据。
每组数据第一行包含三个整数 L,R,C 分别表示地牢层数,以及每一层地牢的行数和列数。
接下来是 L 个 R 行 C 列的字符矩阵,用来表示每一层地牢的具体状况。
每个字符用来描述一个地牢单元的具体状况。
其中, 充满岩石障碍的单元格用”#”表示,不含障碍的空单元格用”.”表示,你的起始位置用”S”表示,终点用”E”表示。
每一个字符矩阵后面都会包含一个空行。
当输入一行为”0 0 0”时,表示输入终止。
输出格式
每组数据输出一个结果,每个结果占一行。
如果能够逃脱地牢,则输出”Escaped in x minute(s).”,其中X为逃脱所需最短时间。
如果不能逃脱地牢,则输出”Trapped!”。
数据范围
1≤L,R,C≤100
输入样例:
3 4 5
S…
.###.
.##…
###.#
##.##
##…
#.###
####E
1 3 3
S##
#E#
0 0 0
输出样例:
Escaped in 11 minute(s).
Trapped!
Ideas
bfs走迷宫求最少步数,不能用一个minute
Code
# bfs
dx = [0,0,0,0,1,-1]
dy = [1,-1,0,0,0,0]
dz = [0,0,1,-1,0,0]
def bfs(start,end):
q = [start]
# minute = 0
state = [[[-1 for i in range(110)] for i in range(110)] for i in range(110)] # -1代表未走,存储的是走到该点需要的
state[start[0]][start[1]][start[2]] = 0
while q:
t = q.pop(0) # 取队首
for i in range(6):
x = t[0] + dx[i]
y = t[1] + dy[i]
z = t[2] + dz[i]
if 0<=x<l and 0<=y<r and 0<=z<c and state[x][y][z]==-1 and lis[x][y][z]!='#':
state[x][y][z] = state[t[0]][t[1]][t[2]] + 1
if x == end[0] and y == end[1] and z == end[2]:
return state[x][y][z]
# state[x][y][z] = 1
q.append((x,y,z))
return -1
while 1:
l,r,c = list(map(int,input().strip().split()))
lis = [] # 存储三维数据
if l or r or c:
for i in range(l):
lis_ = [] # 存储二维数据
for j in range(r):
lis_.append(input().strip())
# 读取空行
input()
lis.append(lis_)
# print(lis)
# 寻找终点和起点
for x in range(l):
for y in range(r):
for z in range(c):
if lis[x][y][z] == 'S':
start = (x,y,z)
if lis[x][y][z] == 'E':
end = (x,y,z)
minute = bfs(start,end)
if minute == -1:
print('Trapped!')
else:
print(f'Escaped in {minute} minute(s).')
else:
break