算法-双指针、BFS与图论-1101. 献给阿尔吉侬的花束

题目

思路

  1. BFS可以搜环,有环也没有关系,如果有解:一定可以找到一条最小步数的合法的路径
  2. Python中 collections模块的详细用法介绍_python collections-CSDN博客
  3. 引用自上述文章:
  1. append(x):添加 x 到右端。
  2. appendleft(x):添加 x 到左端。
  3. clear():移除所有元素,使其长度为0.
  4. copy():创建一份浅拷贝。3.5 新版功能.
  5. count(x):计算deque中个数等于 x 的元素。3.2 新版功能.
  6. extend(iterable):扩展deque的右侧,通过添加iterable参数中的元素。
  7. extendleft(iterable):扩展deque的左侧,通过添加iterable参数中的元素。注意,左添加时,在结果中iterable参数中的顺序将被反过来添加。
  8. index(x, start\[, stop]):返回第 x 个元素(从 start 开始计算,在 stop 之前)。返回第一个匹配,如果没找到的话,升起 ValueError 。3.5 新版功能.
  9. insert(i, x):在位置 i 插入 x 。如果插入会导致一个限长deque超出长度 maxlen 的话,就升起一个 IndexError 。3.5 新版功能.
  10. pop():移去并且返回一个元素,deque最右侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
  11. popleft():移去并且返回一个元素,deque最左侧的那一个。如果没有元素的话,就升起 IndexError 索引错误。
  12. remove(value):移去找到的第一个 value。 如果没有的话就升起 ValueError 。
  13. reverse():将deque逆序排列。返回 None 。3.2 新版功能.
  14. rotate(n=1):向右循环移动 n 步。 如果 n 是负数,就向左循环。如果deque不是空的,向右循环移动一步就等价于 d.appendleft(d.pop()) , 向左循环一步就等价于 d.append(d.popleft()) 。
  15. Deque对象同样提供了一个只读属性:
    maxlen:Deque的最大尺寸,如果没有限定的话就是 None 。

代码

python 复制代码
from collections import deque  # 导入deque模块,用于实现队列数据结构

dx = [-1, 0, 1, 0]  # 定义x方向的偏移量,分别表示上、右、下、左
dy = [0, 1, 0, -1]  # 定义y方向的偏移量,分别表示上、右、下、左

def bfs(start, end):
    # 初始化距离数组为-1,表示未访问过
    dist = [[-1] * m for _ in range(n)]
    # 起点到自身的距离为0
    dist[start[0]][start[1]] = 0

    # 使用deque实现队列,初始将起点加入队列中
    q = deque([start])

    # BFS搜索过程
    while q:
        # 取出队列中的第一个元素
        t = q.popleft()

        # 遍历当前位置的四个邻居节点
        for i in range(4):
            a, b = t[0] + dx[i], t[1] + dy[i]

            # 如果邻居节点越界或者已经访问过,跳过当前循环
            if a < 0 or a >= n or b < 0 or b >= m:
                continue
            if dist[a][b] != -1: # 说明可以走
                continue
            # 如果邻居节点是障碍物,跳过当前循环
            if g[a][b] == '#':
                continue

            # 更新邻居节点的距离,并加入队列中
            dist[a][b] = dist[t[0]][t[1]] + 1

            # 如果邻居节点是终点,返回最短路径长度
            if (a, b) == end:
                return dist[a][b]

            q.append((a, b))

    # 如果无法到达终点,返回-1
    return -1

# 读取测试样例数量
T = int(input())

# 遍历每个测试样例
for _ in range(T):
    # 读取迷宫的行数和列数
    n, m = map(int, input().split())

    # 读取迷宫的每一行
    g = [input() for _ in range(n)] # 读入的是字符串

    start, end = None, None
    # 查找起点和终点的位置
    for i in range(n):
        for j in range(m):
            if g[i][j] == 'S':
                start = (i, j) # 元组
            elif g[i][j] == 'E':
                end = (i, j)

    # 使用BFS计算最短路径长度,并打印结果
    distance = bfs(start, end)

    if distance == -1:
        print("oop!")
    else:
        print(distance)
相关推荐
江畔柳前堤7 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore8 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考10 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX10 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面11 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号11 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽11 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI11 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者13 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者13 小时前
【征程6】校准量化中HistogramObserver解析
算法