蓝桥杯py组入门(bfs广搜)
7. 走迷宫
7.走迷宫 - 蓝桥云课
题目描述
给定一个 N×M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。
已知迷宫的入口位置为 (x1,y1),出口位置为 (x2,y2)。问从入口走到出口,最少要走多少个格子。
输入描述
输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。
接下来输入一个 N×M 的矩阵。若 Gi,j=1 表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。
1≤N,M≤10^2,0≤Gi,j≤1,1≤x1,x2≤N,1≤y1,y2≤M。
输出描述
输出仅一行,包含一个整数表示答案。
若无法从入口到出口,则输出 −1。
输入输出样例
示例 1
5 5
1 0 1 1 0
1 1 0 1 1
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5
8
很标准的广搜,深搜的话会爆时间
代码
import queue
N = 110
g = [[-1] * N for _ in range(N)]
dist = [[-1] * N for _ in range(N)]
d = [[1,0],[0,1],[-1,0],[0,-1]]
n, m = map(int,input().split())
for i in range(1, n + 1):
g[i][1 : m + 1] = list(map(int,input().split()))
x1, y1, x2, y2 = map(int,input().split())
def bfs():
q = queue.Queue()
q.put([x1, y1])
dist[x1][y1] = 0
while not q.empty():
x, y = q.get()
if x == x2 and y == y2:
return dist[x2][y2]
for i in range(4):
nx = x + d[i][0]
ny = y + d[i][1]
if nx < 1 or nx > n or ny < 1 or ny > m:
continue
if g[nx][ny] == 1 and dist[nx][ny] == -1:
dist[nx][ny] = dist[x][y] + 1
q.put([nx, ny])
return -1
t = bfs()
print(t)
加油