题眼
“显然他应避开有怪物的方格,并经过最少的方格”
对于题目的理解就是, 从一个给定的出发点到达一个给定的终点,
也就是搜索路径,但是题目支出要经过最少的方格,我就直接想到
的是 BFS了, 因为BFS对于这类题的求解答案本身就是最优的
解题思路
通过遍历迷宫的数据,找到起始点, 以此进入广度优先搜索函数,
在函数中通过遍历当前点的 上、下、左、右 四个方向, 看看哪个方向
可以继续搜索下去,如果可以,那么把这个方向的点加入到队列中,每次
从队列中取出第一个元素,这样发散的搜索下去,直到找到终点 *
如果题目有解,那么终究会找到一条最近的路,这就是BFS的特点
提前准备
1、距离状态数组 distance
-1 表示 起点不能到达该点 mg[i][j]
0 则与-1 相反, 表示可达的
>0 表示距离, 也就是起点到 mg[i][j]的距离
2、方向向量 dx、dy
dx、dy是一个长度为4的以为数组,有四个组合的值,
表示 上、下、左、右, 这里指的是数组的方向向量
注意点
from collections import deque
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x1, y1):
global mg, n, m, distance
q = deque()
q.append((x1, y1))
distance[x1][y1] = 0
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if (nx < 0 or nx >= n) or (ny < 0 or ny >= m):
continue
if mg[nx][ny] == "#":
continue
if distance[nx][ny] > 1:
continue
if mg[nx][ny] == "*":
return distance[x][y] + 1
q.append((nx, ny))
distance[nx][ny] = distance[x][y] + 1
if __name__ == "__main__":
while True:
n, m = map(int, input().split())
if n == m == 0:
break
mg = [input() for _ in range(n)]
distance = [[-1] * m for _ in range(n)]
for i in range(n):
for j in range(m):
if mg[i][j] == "@":
res = bfs(i, j)
print(res) if res else print(-1)
break