【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11)

这篇具有很好参考价值的文章主要介绍了【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

写在前面:

题目:844. 走迷宫 - AcWing题库

题目描述:

输入格式:

输出格式:

输入样例:

输出样例:

解题思路:

代码:

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,

事不宜迟,我们即刻开始刷题!

题目:844. 走迷宫 - AcWing题库

题目描述:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

输入格式:

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含 m 个整数(00 或 11),表示完整的二维数组迷宫。

输出格式:

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围:

1 ≤ n, m ≤ 100

输入样例:

5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

输出样例:

8

解题思路:

今天,我开始学习广度优先搜索,

如果说深度优先搜索是一直往下搜,触底反弹回溯,再继续搜索出所有情况,

那么广度优先是一层一层的搜索,

简单来说就是就是运用二叉树层序遍历的思想进行搜索,

就比如这道题,走迷宫,我们也可以用深度优先搜索去做,

但是题目要求的数据范围比较大,深度优先会超出时间限制,

所以这个时候就要用到广度优先搜索,

接下来是具体思路:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 我们需要从左上角到右下角,

找出他们的最短路径和,

运用广度优先的思想:

开始搜索:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

继续往下搜索:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 红色的数字1,表示的是该坐标与起点距离是1,

层层记录距离,就能返回最短路径和,

继续搜索:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

以此类推:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 我们就搜索到了最短的路径和,

那么这是怎么实现的呢?

就是利用队列先进先出的特性,

往下遍历的时候,将下一层的数据全部入队:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 然后就让该坐标出队,并将下一层入队:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 继续出队,然后入队:

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

 就能够达成我们广度搜索的条件往下搜索,

下面是代码实现:

代码:

//包好常用头文件
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

//用来存坐标
typedef pair<int, int> PII;

const int N = 110;

int n, m;

//队列
queue<PII> q;

//用来读入地图
int g[N][N];

//用来记录地图状态和层数(离初始位置的距离)
int dist[N][N];

//坐标偏移量
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};

int bfs(int x, int y)
{
    //先把状态都置位-1
    memset(dist, -1, sizeof(dist));
    q.push({x, y});
    
    //起点
    dist[x][y] = 0;
    
    //如果队列不为空,就一直出队搜索
    while(!q.empty())
    {
        //记录队头
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4; i++)
        {
            //上下左右搜索
            int a = t.first + dx[i];
            int b = t.second + dy[i];
            
            //控制边界
            if(a < 1 || a > n || b < 1 || b > m) continue;
            if(g[a][b] != 0) continue;
            
            //如果走过,就不搜索了
            if(dist[a][b] > 0) continue;
            
            //入队
            q.push({a, b});
            
            //记录的路径和+1
            dist[a][b] = dist[t.first][t.second] + 1;
        }
    }
    //返回终点的路径和
    return dist[n][m];
}

int main()
{
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            scanf("%d", &g[i][j]);
        }
    }
    
    int res = bfs(1, 1);
    printf("%d\n", res);
    return 0;
}

AC !!!!!!!!!!

蓝桥杯搜索题,蓝桥杯备赛,蓝桥杯,宽度优先,算法

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。文章来源地址https://www.toymoban.com/news/detail-789404.html

到了这里,关于【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(1)

    目录 写在前面: 题目:P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码: AC !!!!!!!!!! 写在最后: 怎么样才能学好一个算法? 我个人认为,系统性的刷题尤为重要

    2024年01月23日
    浏览(39)
  • 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS)和广度优先搜索(BFS)是图论中两个非常重要的算法,主要用于拓扑排序,寻路(走迷宫)和搜索引擎等。在我们写算法时经常会遇到需要使用DFS和BFS的题目,例如leetcode中的岛屿相关的问题以及有关树的题目大多都会使用DFS或者BFS。 深度优先搜索 深度优

    2024年02月10日
    浏览(45)
  • 深度优先搜索(DFS)和广度优先搜索(BFS)

    代码随想录 深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。这里拿一起讨论,方便比较。 先给大家说一下两者大概的区别: 如果搜索是以接近起始状态的程序依次扩展状态的,叫广度优先搜索。 如果扩展是首先扩展

    2024年02月02日
    浏览(51)
  • 广度优先搜索(BFS)

    注意:本内容主要是介绍用BFS实现图的遍历,所以需要对图的结构有所了解。 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法DFS往一个方向“死磕到底,不撞南墙不回头”的思维方式不同,广度优先搜索算法 关注的重点在于对每一层结点进行下一

    2023年04月09日
    浏览(38)
  • [BFS] 广度优先搜索

    常见的模板 // 使用一个数组判断元素是否入过队 int inqueue[N] = {0}; // 层数或者可以称为深度 int step = 0; // 判断是否可以入队的条件 int isvalid(){      } BFS(int x){     // 将初始的元素压入队列     // 注意每次压队的时候都要将inque[x] = 1,表明入队过     queueint q;     q.push(x);  

    2024年02月09日
    浏览(40)
  • 深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜)

    目录 深度优先搜索(DFS、深搜)和广度优先搜索(BFS、广搜) 深度优先搜索(简称“深搜”或DFS) 广度优先搜索 总结 深度优先生成树和广度优先生成树 非连通图的生成森林 深度优先生成森林 广度优先生成森林 图 1 无向图 深度优先搜索的过程类似于树 的先序遍历 ,首先

    2024年01月20日
    浏览(48)
  • 深度优先搜索(DFS)和广度优先搜索(BFS),用代码讲原理

    以图文的形式对深度搜索和广度搜索的理论进行讲解时,可能会对一些概念有些模糊,且不太清楚怎么把该理论用程序的方式进行复现并解决这一搜索问题(这说的就是本人) 。所以后面我看完了一份实现这两种搜索方法的代码,在这做一个笔记,希望对大家有所帮助。 两

    2024年04月12日
    浏览(50)
  • 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

    深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广搜。 本文只讨论这两种算法在搜索方面的应用! 深度优先搜索 ( Depth-First-Search,DFS )它 沿

    2024年02月13日
    浏览(47)
  • Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

    深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法,用于在图中搜索目标节点或遍历图的所有节点。本篇博客将介绍 DFS 和 BFS 算法的基本概念,并通过实例代码演示它们的应用。 😃😄 ❤️ ❤️ ❤️ 深度优先搜索( DFS )是一种用于遍历或搜索图或树

    2024年02月07日
    浏览(65)
  • C++:第十三讲BFS广度优先搜索

    今天带领大家学一下BFS。 DFS可以看——C++:第十二讲DFS深搜(二)_c++匿名函数dfs-CSDN博客 广度优先搜索(breadth-first search,缩写为bfs)又名宽度优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。其别名又叫BFS,属于一种盲目搜寻法,目的是

    2024年01月25日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包