备赛蓝桥杯【大学python组】 13走迷宫

【代码】

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)  # 输出最终步数

【结果截图】

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值