广度优先搜索入门

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表的显示

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 263

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

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

算法探索之路 652

Virtualbox “Kernel driver not installed (rc=-1908)”问题全面解析与修复指南

本文全面解析了Virtualbox出现'Kernel driver not installed (rc=-1908)'错误的原因及修复方法。详细介绍了如何通过重新安装virtualbox-dkms、处理Secure Boot特殊情况等步骤解决该问题,并提供了预防措施与最佳实践,帮助用户避免类似错误再次发生。

weixin_30352645的博客 528

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

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

Mackyhuang 1280

Spyglass功耗分析:从RTL到优化的全流程实践

本文详细介绍了在RTL设计阶段使用Spyglass进行早期功耗分析的全流程实践。通过一个真实项目案例,阐述了早期功耗分析的必要性,并手把手指导了从文件准备、GUI操作到报告解读与优化的完整步骤。文章重点说明了如何利用Spyglass实现功耗分析的“左移”,在编码阶段识别和修复功耗热点,从而避免后期高昂的修改成本,是低功耗芯片设计的关键技能。

purple的博客 1115

这才是 Python 的正确玩法!用强化学习 (RL) 训练 AI 玩《王者荣耀》,胜率 90%!

大家打排位时,一定遇到过那种“意识神级、操作零失误”的对手,或者“走位呆滞、送人头”的队友。以前的“人机”是程序员写死的脚本(If 血量<20% Then 回城)。而现在的顶级 AI(如腾讯绝悟、OpenAI Five),是靠强化学习 (Reinforcement Learning)自己“左右互搏”练出来的。今天,我们不谈枯燥的数学公式,我将手把手教你用,搭建一个能玩 MOBA 游戏的 AI Agent。即使不能去 KPL 打职业,虐一下钻石局还是绰绰有余的!

BUG猿的博客 1182

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

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

weixin_39626237的博客 96

SAP_ABAP_SD_BAPI清单案例教程——销售订单开票_BAPI_BILLINGDOC_CREATEMULTIPLE_VF01_S4版本

SAP BAPI(Business Application Programming Interface)是SAP系统中的一组规范和标准,用于从SAP系统中获取数据、输入数据和更新数据。这些API允许开发者以编程方式与SAP系统交互,而无需编写大量的自定义代码。2.1 Copy代码 直接可使用。2.2 VF01开票。

java_zhong1990的专栏 2214

广度优先搜索-算法入门

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

m0_62174308的博客 1487

微信小程序:errno: 1500104, errCode: 10008, errMsg: “writeBLECharacteristicValue:fail:system error, status

微信小程序errno: 1500104, errCode: 10008, errMsg: "writeBLECharacteristicValue:fail:system error, status: UNKNOWN (239)"微信小程序调用蓝牙API,wx.writeBLECharacteristicValue()报错,微信小程序蓝牙写入错误,在开发uniapp微信小程序蓝牙通信功能时报错,蓝牙开发设备控制核心api,微信小程序调用蓝牙API “wx.writeBLECharacteristicValu

✅ 精选推荐文章 3929

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

BFS广度优先搜索入门

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

ly's Blog 665

【SI案例分享】1000 BASE-T1共模终端的分析与评估

以太网的MDI接口应用中,共模端接网络的应用广泛,并且,其电路参数从100 BASE-T1到1000 BASE-T1保持了相同的参数定义,这就不得不引起使用者的怀疑,毕竟百兆和千兆以太网的工作频段差异巨大,这样的设计真的可以做到上下兼容吗?本文针对此问题,进行了深入的探讨。

一只豌豆象的博客 1364

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

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

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

﹎厡.唻 532

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

刷这些题时死掉的脑细胞是我当年在《线性代数》和《概率论与数理统计》课上没学明白时苟活下来的( 这几题基本是抄作业了,但我发现官方题解写的也很绕,都不知道是我天然看到这类题就头晕眼花春困秋乏还是怎么,总之使劲把自己掐清醒后把题目和官方题解以我自己能看懂的文字记录下来。 相关计划: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、付费专栏及课程。

余额充值