【代码】
import sys
import os
#
from collections import deque
dx = [0, 1, -1, 0] # x 方向移动
dy = [1, 0, 0, -1] # y 方向移动
def pd(x, y):
# 判断当前坐标是否合法及可访问
if x < 1 or x > n or y < 1 or y > m or vis[x][y] != 0 or G[x][y] != 1:
return False
return True
def check(x, y):
global ans
# 判断是否达到终点
if x == End.x and y == End.y:
ans = vis[x][y] # 获取到达终点时的步数
return True
return False
def BFS():
q = deque()
q.append(Start)
vis[Start.x][Start.y] = 1#已访问
while q:
now = q.popleft()
# 从队列 q 的左侧(队头)取出一个节点作为当前节点 now,并将其从队列中移除
if check(now.x, now.y):#判断是否为终点
return
for i in range(4):
# 对当前节点的四个方向进行遍历
nextx = now.x + dx[i]
nexty = now.y + dy[i]
if pd(nextx, nexty):
next = node(nextx, nexty)
q.append(next)
vis[nextx][nexty] = vis[now.x][now.y] + 1 # 步数加一
# 更新新节点的访问标记 vis[nextx][nexty] 为当前节点的步数加一,表示经过当前节点到达新节点
class node:
def __init__(self, x, y):
self.x = x
self.y = y
if __name__ == '__main__':
n, m, ans = 0, 0, 0
vis = [[0 for _ in range(110)] for _ in range(110)] # 初始化访问数组
G = [[0 for _ in range(110)] for _ in range(110)] # 初始化地图数组
# 输入部分
n, m = map(int, input().split())
for i in range(1, n + 1):
G[i][1:m + 1] = list(map(int, input().split()))
# 读取第 i 行的值
startX, startY, endX, endY = map(int, input().split())#读取起点和终点的坐标
Start = node(startX, startY)
End = node(endX, endY)
# 创建起点和终点坐标
BFS() # 执行广度优先搜索
print(ans - 1) # 输出最终步数
【结果截图】