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

这篇具有很好参考价值的文章主要介绍了算法-双指针、BFS与图论-1101. 献给阿尔吉侬的花束。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

算法-双指针、BFS与图论-1101. 献给阿尔吉侬的花束,算法设计与分析,宽度优先,图论,算法文章来源地址https://www.toymoban.com/news/detail-839653.html

思路

  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 。

代码

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)

到了这里,关于算法-双指针、BFS与图论-1101. 献给阿尔吉侬的花束的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】复习搜索与图论

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己!

    2024年02月05日
    浏览(39)
  • 搜索与图论:匈牙利算法

    将所有点分成两个集合,使得所有边只出现在集合之间,就是二分图 二分图:一定不含有奇数个点数的环;可能包含长度为偶数的环, 不一定是连通图

    2024年02月08日
    浏览(31)
  • 算法基础课-搜索与图论

    题目链接:842. 排列数字 - AcWing题库 思路:写的很好的题解AcWing 842. 排列数字--深度优先遍历代码+注释 - AcWing 也可以考虑使用c++自带的next_permutation函数直接秒了: 题目链接:844. 走迷宫 - AcWing题库 思路:由于bfs是一层一层扩展,所以能保证走到终点时,走过的距离最短,所

    2024年04月15日
    浏览(42)
  • 搜索与图论(acwing算法基础)

    排列数字 n皇后 走迷宫 单链表 点击跳转至例题 idx存的是指针 树与图的深度优先搜索 树的重心 每个节点都是一个单链表 模拟队列 hh = 0 , tt = -1 有向图的拓扑序列 都是从前指向后,即有向无环图(不能有环) 所有入度为0的点,都能排在前面的位置 删掉t-j的边,仅仅是j的入度

    2024年02月08日
    浏览(33)
  • 搜索与图论 - 搜索与图在算法中的应用【中】

    目录 迪杰斯特拉算法Dijkstra  Dijkstra求最短路 I Dijkstra求最短路 II 贝尔曼-福特算法 bellman-ford 有边数限制的最短路 SPFA算法 spfa求最短路  spfa判断负环 Floyd Floyd求最短路   该算法不能存在负权边 思路: 初始化距离数组, dist[1] = 0, dist[i] = inf; for n次循环 每次循环确定一个min加

    2023年04月08日
    浏览(70)
  • 搜索与图论2.2-Floyd算法

    (Floyd) 算法是一种可以快速求解图上所有顶点之间最短路径的算法。 (Bellman-Ford) 和 (Dijkstra) 算法求解的都是从一个起始点开始的最短路。如果想要求解图中所有顶点之间的最短路,就需要枚举每个点做为起点,这样十分低效。 (Floyd) 算法(也称 (Floyd-Warshall) 算法)处理用

    2024年02月08日
    浏览(29)
  • acwing算法基础之搜索与图论--kruskal算法

    kruskal算法的关键步骤为: 将所有边按照权重从小到大排序。 定义集合S,表示生成树。 枚举每条边(a,b,c),起点a,终点b,边长c。如果结点a和结点b不连通(用并查集来维护),则将这条边加入到集合S中。 kruskal算法的时间复杂度为O(mlogm),它用来解决稀疏图的最小生成树问题

    2024年02月05日
    浏览(35)
  • 【算法基础:搜索与图论】3.3 拓扑排序

    https://oi-wiki.org/graph/topo/ 本文主要学习拓扑排序相关知识。 拓扑排序的英文名是 Topological sorting。 拓扑排序要解决的问题是给一个 有向无环图 的 所有节点排序 。 我们可以拿大学每学期排课的例子来描述这个过程,比如学习大学课程中有:程序设计,算法语言,高等数学,

    2024年02月16日
    浏览(35)
  • Acwing-基础算法课笔记之搜索与图论

    bellman-ford算法适用于负权边的图,求 1 到 n 的最多经过k条边的最短距离。 如图所示: 1 2 3 dist 0 ∞ infty ∞ ∞ infty ∞ ⇓ Downarrow ⇓ 1 2 3 dist 0 1 ∞ infty ∞ ⇓ Downarrow ⇓ 1 2 3 dist 0 1 2 此过程中出现了串联的结果,所以是错误的,此时需要进行备份操作。 备份操作如下: 为了

    2024年01月20日
    浏览(41)
  • acwing算法基础课(第三讲 搜索与图论)

    void dfs(int u){ if(n == u){ for(int i = 0;i n;i++) puts(g[i]); puts(“”); return; } for(int i = 0;i n;i++){ if(!col[i] !dg[u+i] !udg[n - u + i]){ g[u][i] = ‘Q’; col[i] = dg[u+i] = udg[n - u + i] = true; dfs(u+1); col[i] = dg[u+i] = udg[n - u + i] = false; g[u][i] = ‘.’; } } } int main(){ scanf(“%d”,n); for(int i = 0;i n;i++){ for(int j = 0;j

    2024年04月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包