题目描述
给定一个 N x M 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1表示,障碍物用 0表示)
已知迷宫的入口位置为(x1,y),出口位置为(x2,y2)。问从入口走到出口,最少要走多少个格子。
输入描述
输入第 1行包含两个正整数 N,M,分别表示迷宫的大小。
接下来输入一个 N xM 的矩阵。若 G(i,j)=1表示其为道路,否则表示其为障碍物。
最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。
1 <= N,M <= 10**2 , 0 <= G(i,j) <= 1 , 1<= x1,x2 < N , 1 <= y1,y2 < M
输出描述
输出仅一行,包含一个整数表示答案。
若无法从入口到出口,则输出 一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
代码
from collections import deque
#1.接收输入
n,m = map(int,input().split())
#接受迷宫数值
maze = [[] * (m+1) for _ in range(n+1)]
for i in range(1,n+1):
maze[i] = [0] + list(map(int,input().split()))
x1,y1,x2,y2 = map(int,input().split())
#2.广度优先搜索
def bfs():
#2.1创建所需变量
q = deque()
q.append((x1,y1,0)) #纳入队列的点,步数
visited = set()
dic = [(0,1),(0,-1),(1,0),(-1,0)]
#2.2判断队列是否为空
while q:
#遍历队列
for _ in range(len(q)):
x,y,step = q.popleft()
if x == x2 and y == y2:
return step
if (x,y) in visited:
continue
visited.add((x,y)) #否则加入该点
for c in dic:
nx,ny = x+c[0], y+c[1]
if 1<=nx<=n and 1<=ny<=m and maze[nx][ny] == 1 :
q.append((nx,ny,step+1))
return -1 #如果所有可能都没找到出口
print(bfs())