算法-双指针、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)
相关推荐
passer__jw76711 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾17 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序25 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法