广度优先搜索入门

BFS——广度优先搜索的简单易懂入门心得 BFS(广度优先搜索)。 本文应用的语言为C++。 在了解之前,稍微简单介绍一下C++库里STL里的 queue(队列),一个数据“先进先出”的数据结构。 首先调用库queue 定义:queue<数据类型>队列名称; .push( 数据 );将数据加入队列 .pop();将队首数据弹出队列 .front();取出队列首的数据,但不删除。 为什么需要用到队列呢? 假设我们建立了一棵树,想... 阅读详情

广度优先搜索入门


实现流程(用 queue ):

  1. 放入初始结点 S0 到 Open 表中(待访问)。
  2. 如果 Open 表为空,失败退出。
  3. 不为空,取出队头放入 Close 表(标记已经访问过),即为节点 n。
  4. 考察n是否为目标节点。是则成功退出。
  5. 若不是,看 n 是否可扩展,不可扩展则退回第 2 步。
  6. 若可扩展,则将其不再 Close 表和 Open (真正实现判重一般是为每个节点设置一个标记,而不是搜表)表中的子节点放入 Open 表的尾部,同时记录指向父节点的指针(可用于得到路径和层数)。转到第 2 步。

例题练习

题目1、POJ4001:抓住那头牛

描述
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟

假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?

输入
两个整数,N和K

输出
一个整数,农夫抓到牛所要花费的最小分钟数

样例输入

5 17

样例输出

4


分析:

  • 农夫和牛都位于一维的数轴,牛不动而农夫移动,最终目的是农夫移动到牛的位置。

  • 这道题求最小分钟数,也就是最少步数,也就是最短路径的长度。

  • 我们可以用深搜 + 剪枝来做,也可以用广搜来做。状态就是农夫所处的位置的下标 Xi ,那么初始状态是 N ,目标状态是 K ,状态转移是 Xi+1 、 Xi-1 或者 Xi*2。



AC代码

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;

    struct Node 
    { 
        int index;        //当前节点的位置 
        int level;        //当前节点所在层次  求路径就还要保留父节点位置 
    };

    int N,K;              //农夫和牛的初始位置
    int visit[100010];    //标记数组,是否访问过
    int minT;     

    int main()
    {
        scanf("%d %d",&N,&K);
        memset(visit,0,sizeof(visit));
        queue<struct Node> q;

        //初始节点入队 
        visit[N] == 1;
        Node node;
        node.index = N;node.level = 0;
        q.push(node);

        while(!q.empty())
        {
            //取出队头
            node =  q.front();q.pop();

            if(node.index == K)
            {
                printf("%d\n",node.level);   //找到了,level就是层数,就是步数 
                return 0;
            }

            //能访问且未访问过 
            if(node.index - 1 >= 0 && visit[node.index - 1] == 0)
            {
                Node temp;
                temp.index = node.index - 1;
                temp.level = node.level + 1;
                q.push(temp);           //放入队尾
                visit[temp.index] = 1; 
            }

            if(node.index + 1 <= 100000 && visit[node.index + 1] == 0)
            {
                Node temp;
                temp.index = node.index + 1;
                temp.level = node.level + 1;
                q.push(temp);           //放入队尾
                visit[temp.index] = 1; 
            }

            if(node.index * 2 <= 100000 && visit[node.index * 2] == 0)
            {
                Node temp;
                temp.index = node.index * 2;
                temp.level = node.level + 1;
                q.push(temp);           //放入队尾
                visit[temp.index] = 1;  
            } 
        }

        return 0;
    }


例题练习

题目2、POJ4127:迷宫问题

描述
定义一个二维数组,它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

int maze[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,

};

输入
一个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

样例输出

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

思路:

  • 寻找最短路径,典型的广搜问题。因为深搜能找到最短路径长但是路径不好记录。

  • 不能用queue了,因为queue模板中的出队就删除了节点,而我们需要保存节点来输出路径。

AC代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    using namespace std;

    struct Node
    {
        int r,c;             //节点所在行列 
        int p;               //节点的父亲的下标 
    }queue[10];              //自定义队列 

    int map[10][10];
    int visit[10][10];      //标记数组 
    int head,tail;          //队头下标,队尾下标 
    int dir[4][4] = {{1,0},{-1,0},{0,1},{0,-1}};       //方向数组 

    int main()
    {
        for(int i = 0; i < 5; i ++)
            for(int j = 0; j< 5; j ++)
                scanf("%d",&map[i][j]);

        memset(visit,0,sizeof(visit));      

        head=0;tail=0;
        //初始结点入队
        Node node;
        node.r = 0;node.c = 0;node.p = -1;
        visit[0][0] = 1;
        queue[0] = node; 
        tail++;

        while(head != tail)     //head == tail 就表示队列为空
        {
            Node node = queue[head];   //相当于front(); 

            //达到终点 
            if(node.c == 4 && node.r == 4)
            {
                vector<struct Node> rode;    //用vector保存路径的逆序
                rode.push_back(node);
                int p = node.p;

                while(p != -1)
                {
                    node = queue[p];
                    rode.push_back(node);   
                    p = node.p;
                }

                vector<struct Node >::iterator it;   
                for(it = rode.end()-1; it >= rode.begin(); it --)
                {
                    node = *it;
                    cout<<"("<<(*it).r<<", "<<(*it).c<<")"<<endl;
                }

                return 0;
            }   

            //不是终点 入队所有关联的点 
            for(int i = 0; i < 4; i++)
            {
                int tempR = node.r + dir[i][0];
                int tempC = node.c + dir[i][1];

                //能访问且未访问过 
                if(tempR >=0 && tempR <=4 && tempC >= 0 &&tempC <= 4)
                {
                    if(visit[tempR][tempC] == 0 && map[tempR][tempC] == 0)
                    {
                        visit[tempR][tempC] = 1;

                        Node tempN;
                        tempN.r = tempR;tempN.c = tempC;tempN.p = head;
                        queue[tail] = tempN;

                        tail ++;
                    }
                }
            }

            head ++;  //相当于pop(); 

        }   
        return 0;
    }


拓展

POJ鸣人与佐助(广搜)

poj3984迷宫问题---适合入门的一道广度优先搜索题 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7098   Accepted: 4153 Description 定义一个二维数组:  int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 阅读详情

相关推荐

Python算法——广度优先搜索

广度优先搜索是一种强大而常用的算法,对于解决与图或树相关的问题非常有帮助。通过理解BFS的原理和实现,您将能够更好地应用该算法解决实际问题。广度优先搜索的核心思想是通过队列来实现层次遍历。

Echo_Wish 1068

人工智能课后作业_python实现广度优先遍历搜索(BFS)(附源码)

广度优先搜索算法(英语:Breadth-First-Search,缩写为BFS),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。BFS是一种盲目搜索法,目的是系统地展开并检查图中的所有节点,以找寻结果。BFS会先访问根节点的所有邻居节点,然后再依次访问邻居节点的邻居节点,直到所有节点都访问完毕。

实力派,无需多言! 1488

广度优先搜索BFS-从入门到精通【卡玛】

没有理论基础的先看卡哥讲解的,很通俗易懂~,简单概括“📌广度优先搜索(Breadth First Search,简称 BFS)是一种在图或树等数据结构中遍历节点的算法。它从起始节点开始,以该节点为中心,一层一层向外扩展,依次访问同一层的所有节点,把这一层的节点都访问完后,才进入下一层继续访问,直至遍历完所有可达节点或找到目标节点。本篇注重代码实现并配有相关例题/模版题区别:广搜(bfs)是一圈一圈的搜索过程,和深搜(dfs)是一条路跑到黑然后再回溯。

qq_73704268的博客 1062

广度优先搜索

jianjie广度优先算法(Breadth-First-Search),又称作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索演算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点,如果发现目标,则演算终止。广度优先搜索的实现一般采用open-closed表。

u011415955的专栏 1109

代价树的广度优先搜索 带有open表和closed表的显示

代价树的广度优先搜索 带有open表和closed表的显示

8卡H20运行DeepSeek-V3-0324性能和推理实测

最近在一台 8卡H20 机器上,先后部署了 DeepSeek-R1-AWQ (671B)和最新的 DeepSeek-V3-0324 (685B) ,测试了下性能和数学问题跑分。服务器由火山引擎提供。

weixin_53138109的博客 3362

leetcode 104. 二叉树的最大深度(python)

104. 二叉树的最大深度 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # se...

算法探索之路 652

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

轻松掌握广度优先搜索入门

轻松掌握广度优先搜索入门 广度优先遍历(BFS)是图的搜索算法之一,让我们直接进入主题,来感受一下它! 让我们明白广度的深意,大家是否玩过扫雷(权当大家玩过或者看别人玩过),当点击一个点以后,以这个点为中心,宛如水中落下石子一般荡漾开来,周围的点都会展开,这就像是广度优先搜索的搜索方式 再一个栗子!二叉树的是个容易在大脑中构建的模型,遍历二叉树的时候,如果是一层一层遍历,那么就是广度优先搜索(若是...

Mackyhuang 1280

高分创新点!Mamba+CNN结合,发顶会首选!

研究摘要 近期视觉领域涌现CNN与Mamba的融合架构,通过双分支设计互补优势。ConvMamba结合CNN的局部特征提取与Mamba的全局建模能力,在ImageNet分类任务中实现90.2%准确率,推理速度提升1.8倍。医学图像方向,PGM-UNet引入提示引导残差Mamba模块,结合多尺度空洞卷积与KANs,显著提升分割精度;遥感领域CM-UNet通过CSMamba块与多尺度注意力聚合模块,有效捕捉长距离依赖。这些工作表明,跨模态轻量化融合与注意力优化是未来重要方向。

m0_73122726的博客 1009

从菜鸟到大神:VSCode助力HTML开发全攻略

本文全面介绍 VSCode 在 HTML 开发中的高效应用。先引导读者完成 VSCode 的安装与个性化设置,助其快速适应开发环境;接着推荐 Live Server、Prettier 等实用插件,实现实时预览、代码格式化等功能,提升开发效率。通过详细的开发实战步骤,从新建文件到添加样式,带领读者掌握 HTML 基础结构与常用标签使用。还分享代码片段管理、多人协作等进阶技巧,解决常见开发问题。旨在帮助开发者利用 VSCode,轻松高效完成 HTML 开发,打造优质网页。

邓邓子的博客 3364

广度优先搜索_快速入门广度优先搜索

通过学习图的搜索算法,我们来学习下两种常见的算法:BFS、DFS。广度优先搜索(BFS)广度优先搜索(Breadth-First-Search),它更像是一种地毯式、层层推进的搜索策略。先从距离起始点最近的顶点开始,然后以“水波纹”一样往外扩散。代码实现假设图的结构如下:/** * 字典 */ class Dictionary { constructor() { this.items =...

weixin_39626237的博客 96

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2246

广度优先搜索-算法入门

广度优先搜索(BFS)-算法入门 广度优先搜索概述 广度优先搜索本质上,其实是一种迭代的思想,通过源点扩散地去搜索其他的点,搜到的点用队列来维护,再用这些点继续扩散,从而达到遍历全局;形象来说的话,可以想象成新冠疫情的扩散一样,先从一个城市爆发,如果不加以管制,它便扩散到它临近的城市,再以临近的城市为据点,继续扩散。

m0_62174308的博客 1487

智慧社区:安防系统解决方案

智慧社区:安防系统解决方案

s13166803785的博客 431

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 671

BFS广度优先搜索入门

1.BFS简介: 2.BFS与DFS的区别: 3.实现BFS的准备: 最常用的BFS的模板如下: void bfs(起始点) { 将起始点放入队列中; 标记起点访问; while (如果队列不为空) { 访问队列中队首元素x; 删除队首元素; for (x 所有相邻点) { if (该点未被访问...

ly's Blog 665

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

BFS广度优先搜索——入门

BFS——广度优先搜索 广度优先搜索是通过对图的完全遍历来达到要求的点的算法。其对图的遍历是如同波浪一样,每层按照制定的方式一层一层向下搜。 如: 5 5 4 2 5 5 2 4 2 3 4 2 3 4 4 1 4 1 1 2 6 7 5 3 4 在以3为

ilblue的博客 5410

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【算法入门】广度优先搜索

1.图 最短路径问题。 解决最短路径问题的算法被称为广度优先搜索,广度优先搜索指出是否有从A到B的路径。 求最短路径的两个步骤:1)使用图建立问题模型;2)使用广度优先搜索解决问题。 图由节点和边组成,一个节点可能与众多节点直接相连,这些节点被称为邻居。 2.广度优先搜索 一种用于图的查找算法 可解决两个问题:1)是否存在路径;2)哪条路径最短 3.队列 只支持两种操作:入队和出队 ...

﹎厡.唻 532

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

力扣入门级广度优先搜索/遍历刷题小结

刷这些题时死掉的脑细胞是我当年在《线性代数》和《概率论与数理统计》课上没学明白时苟活下来的( 这几题基本是抄作业了,但我发现官方题解写的也很绕,都不知道是我天然看到这类题就头晕眼花春困秋乏还是怎么,总之使劲把自己掐清醒后把题目和官方题解以我自己能看懂的文字记录下来。 相关计划:20天算法刷题计划 相关题目: 733.图像渲染 695.岛屿的最大面积 617.合并二叉树 116.填充每个节点的下一个右侧节点指针 542.01矩阵 994.腐烂的橘子 文章目录733.图像渲染 733.图像渲染 有一幅以

循此苦旅,以达天际 1637

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据结构与算法之图的入门(图的基础介绍 以及无向图的深度优先搜寻、广度优先搜索)

目录一、图的入门1.1 图的实际应用:1.2 图的定义及分类1.3 无向图1.3.1 图的相关术语1.3.2 图的存储结构1.3.2.1 邻接矩阵1.3.2.2 邻接表1.3.3 图的实现1.3.3.1 图的API设计1.3.3.2 代码实现1.3.4 图的搜索1.3.4.1 深度优先搜索1.3.4.2 广度优先搜索1.3.5 案例-畅通工程续 11.3.6 路径查找1.3.6.1 路径查找API设计1.3.6.2 路径查找实现 一、图的入门 1.1 图的实际应用: 在现实生活中,有许多应用场景会包含很多点

weixin_52448922的博客 905

广度优先搜索 入门题

光搜入门级题目,大神止步

雪松-不仅仅是程序员 1577
上一篇: POJ1190:生日蛋糕(深搜+剪枝)
下一篇: POJ4115:鸣人和佐助(广搜)
WaveBridge
博客等级 码龄10年 8粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值