链接:https://ac.nowcoder.com/acm/contest/50350/B
来源:牛客网
题目描述
给出一个n*m的迷宫,其中标记为1的为障碍,标记为0的为可以通行的地方。
迷宫的入口为左上角,出口为右下角,只能从一个位置走到这个它的上、下、左、右四个方向之一。
如果能顺利走出迷宫就输出YES,否则输出NO
输入描述:
输入一个n行m列的迷宫(0<n<=100,0<m<=100)。 输出描述:
输出YES或NO
看B站uid:514996834 牛客:迷宫问题(完整函数)
结合此视频做该题如下:
s=input().split(' ')
n=int(s[0])
m=int(s[1])
if m>n:
z=m
else:
z=n
line=[[1]*(z+2)]*(z+2) # 在数组周围包裹墙,四面,下面构成n*n数组(n为max(m,n))
'''
eg:
输入
2 2
0 1
1 0
输出
[[1, 1, 1, 1],
[1, 0, 1, 1],
[1, 1, 0, 1],
[1, 1, 1, 1]]
eg2.
输入
4 6
0 1 0 0 0 0
0 0 0 1 0 0
0 0 1 0 0 1
1 1 0 0 0 0
输出
[[1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 0, 0, 1, 1],
[1, 1, 1, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1]]
'''
for i in range(1,n+1):
line[i]=input().split(' ')
line[i]=[int(j) for j in line[i]]
for i in range(1,n+1):
line[i].insert(0,1)
line[i].append(1)
maze=line
print(line)
start=(1,1)
end=(n,m)
lst=[start]
while lst:
now=lst[-1]
if now == end:
print('YES')
break
row,col=now # 解包
maze[row][col]=2 # 标记已经走过的点
# 上下左右,邻居是否为0
if maze[row-1][col]==0:
lst.append((row-1,col))
continue
elif maze[row][col+1]==0:
lst.append((row,col+1))
continue
elif maze[row+1][col]==0: # down
lst.append((row+1,col))
continue
elif maze[row][col-1]==0: # lift
lst.append((row,col-1))
continue
else: # 邻居不能走
lst.pop() # 把最后一个节点退出
else:
print('NO')