c小明刚刚参加完期中考试,“这次又能得班级第一了”,他沾沾自喜,想起之前一直努力学习的自己,他决定去西城红场看个电影放松一下。现在小明想从学校走到电影院,因为市政大力修路和挖地铁,有些道路不允许步行,请判断小明能否走到电影院(只能朝上下左右四个方向行走),如果能到,则输出最短步数,如果不能到,则输出 NoNo。
时间: 2024-03-25 22:35:30 浏览: 15
很高兴回答你的问题!这是一个典型的迷宫问题,可以使用 BFS 算法来解决。我们可以将迷宫看作一个二维矩阵,其中 0 表示可以通过,1 表示不可通过。小明的起点和终点分别是迷宫的左上角和右下角。下面是代码实现:
```python
from collections import deque
def bfs(maze):
m, n = len(maze), len(maze[0])
start, end = (0, 0), (m-1, n-1)
if maze[start[0]][start[1]] or maze[end[0]][end[1]]:
return 'NoNo'
queue = deque([(start, 0)])
visited = set([start])
while queue:
pos, steps = queue.popleft()
if pos == end:
return steps
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
x, y = pos[0]+dx, pos[1]+dy
if 0<=x<m and 0<=y<n and not maze[x][y] and (x, y) not in visited:
queue.append(((x, y), steps+1))
visited.add((x, y))
return 'NoNo'
maze = [
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 1],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0]
]
print(bfs(maze)) # 输出 9
```
在上面的代码中,我们使用了一个队列和一个 set 来分别保存待访问的位置和已经访问过的位置。对于每个位置,我们都会尝试向四个方向进行拓展,如果该方向上的位置可以走,并且没有被访问过,那么就将该位置加入队列,并将其标记为已访问。这样,当我们找到终点时,就可以直接返回步数了。如果最终无法到达终点,则返回 NoNo。