BFS(广度优先搜索)简单例题(一)

【数据结构】2个例题带你理解图的遍历:广度优先搜索 广度优先搜索遍历图的过程,实际上就是寻找队列中顶点的邻接点的过程。从图中的某个顶点v开始,先访问该顶点再依次访问该顶点的每一个未被访问过的邻接点 阅读详情

bfs想必非常的熟悉了,bfs大多数用来解决什么问题呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。所以这篇博客,主要是利用bfs找迷宫的最短距离。首先看看bfs一般的使用套路:

Problem 2285 迷宫寻宝

链接:http://acm.fzu.edu.cn/problem.php?pid=2285

本题就是一个基本上就是纯模板题,就是从S开始走,走到终点E的路径最短,#是障碍物不能走,如果不能找到终点的路就输出-1,而且只能上下左右四个方向走。

思路就是先遍历一遍记录初始位置,和终点的位置,然后就是纯正的模板了,利用bfs来实现,但是在实现的过程中,如果找到终点那么就标记一下,然后break掉。没有标记的话就直接输入-1。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
char a[1010][1010];//记录整个图形的
int vis[1010][1010];//用来标记的走没走过
struct Point{
     int x, y;
}tmp1, tmp2;
int mt[4][2] = {1,0,-1,0,0,1,0,-1};//移动的四个方向
queue<Point>q;
int main(){
    int n, i, j;
    while(~scanf("%d", &n)){
         for(i = 0; i < n; i++){
            scanf("%s", a[i]);
         }
         int sx, sy;
         int ex, ey;
         for(i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                vis[i][j] = 0;//初始化标记
                if(a[i][j] == 'S'){//找到初始位置
                    sx = i;
                    sy = j;
                }
                else if(a[i][j] == 'E'){//终点位置
                    ex = i;
                    ey = j;
                }
            }
         }
         while(!q.empty()){//队列初始化
             q.pop();
         }
         tmp1.x = sx;
         tmp1.y = sy;
         vis[tmp1.x][tmp1.y] = 1;//首先压入起始位置
         q.push(tmp1);
         int flag = 0;
         while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 4; i++){
                tmp2.x = tmp1.x + mt[i][0];//引动的方向
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >=0 && tmp2.x < n && tmp2.y >= 0 && tmp2.y < n && !vis[tmp2.x][tmp2.y] && a[tmp2.x][tmp2.y] != '#'){
                        //判断条件
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;//原来的位置加一
                    q.push(tmp2);
                }
            }
            if(vis[ex][ey]){//如果到达终点就标记一下,表示能到达终点
                flag = 1;
                break;
            }

         }
         if(flag)printf("%d\n", vis[ex][ey]-1);//终点位置也包括在内,所以减1
         else printf("-1\n");

    }

return 0;
}

移动

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1181

本题就是在300*300的方格内移动问起始点到终止点的最小移动距离,输入数据只给了起始点坐标,和终止点坐标。本题也是一个非常明显的一个bfs题型。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;

int vis[305][305];
int mt[8][2] = {1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2};
struct Point{
    int x, y;
}tmp1, tmp2;
queue<Point>q;
int main(){
    int sx, sy, ex, ey;
    while(~scanf("%d %d %d %d", &sx, &sy, &ex, &ey)){
        while(!q.empty()){
            q.pop();
        }
        memset(vis, 0, sizeof(vis));//注意格式化,切记。非常容易忘
        tmp1.x = sx;
        tmp1.y = sy;
        vis[tmp1.x][tmp1.y] = 1;
        q.push(tmp1);
        int i;
        while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 8; i++){
                tmp2.x = tmp1.x + mt[i][0];
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >= 0 && tmp2.x <=300 && tmp2.y >= 0 && tmp2.y <= 300 && !vis[tmp2.x][tmp2.y] ){
                        //判断条件范围限制在300*300的范围
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;
                    q.push(tmp2);
                }

            }
            if(vis[ex][ey])break;
        }
        printf("%d\n", vis[ex][ey]-1);
    }
return 0;
}

迷宫问题

链接:http://poj.org/problem?id=3984

本题也是一个走迷宫的问题,但是本题和之前的几道题之间的差距就在于本题问你是如何走得,也就时你走迷宫的具体路径,主体思想跟之前的几道题没有变依然是bfs类的问题,但是重点是如何储存走过的点,以及如何输出。

记录输入输出的思想就是要从终点开始往回找点,用另外的结构体数组储存一下,然后输出就可以了,但是如何往回找呢?往回找就看你是如何储存的,先申请结构体数组。用要压入点的位置pre[tmp2.x][tmp2.y].x来记录前一个数组横坐标的位置,pre[tmp2.x][tmp2.y].y来记录另外一个数字纵坐标的位置。

pre[tmp2.x][tmp2.y].x = tmp1.x;

pre[tmp2.x][tmp2.y].y = tmp1.y; 

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int maze[6][6];
int vis[6][6];

struct Point{
     int x, y;
}tmp1, tmp2;
Point pre[10][10];
int mt[4][2] = {1,0,-1,0,0,1,0,-1};
queue<Point>q;
Point ans[30];
int main(){
    int i, j;
    while(~scanf("%d %d %d %d %d", &maze[0][0], &maze[0][1], &maze[0][2], &maze[0][3],&maze[0][4],&maze[0][5])){
        for(i = 1; i < 5; i++){
            for(j = 0; j < 5; j++){
                scanf("%d", &maze[i][j]);
            }
        }
        while(!q.empty()){
            q.pop();
        }
        memset(vis, 0, sizeof(vis));
        tmp1.x = 0;
        tmp1.y = 0;
        vis[0][0] = 1;
        q.push(tmp1);
        while(!q.empty()){
            tmp1 = q.front();
            q.pop();
            for(i = 0; i < 4; i++){
                tmp2.x = tmp1.x + mt[i][0];
                tmp2.y = tmp1.y + mt[i][1];
                if(tmp2.x >= 0 && tmp2.x < 5 && tmp2.y >= 0 && tmp2.y < 5 && !vis[tmp2.x][tmp2.y] && maze[tmp2.x][tmp2.y] == 0){
                    //约束条件
                    vis[tmp2.x][tmp2.y] = vis[tmp1.x][tmp1.y] + 1;
                    q.push(tmp2);
                    pre[tmp2.x][tmp2.y].x = tmp1.x;//保存前一个位置的横坐标
                    pre[tmp2.x][tmp2.y].y = tmp1.y;//保存前一个位置的纵坐标

                }
            }
            if(vis[4][4])break;
        }
        //cout<<vis[4][4]<<endl;
        int lastx = 4, lasty = 4;//终点的位置
        int x, y, num = 0;
        while(lastx || lasty){//如果lastx, lassty,如果全为零的话就停止
            ans[num].x = lastx;//ans 来记录一下
            ans[num++].y = lasty;

            x = lastx;
            y = lasty;
            lastx = pre[x][y].x;//读取下一个,也就是之前保存的前一个
            lasty = pre[x][y].y;

        }
        //cout<<num<<endl;
        printf("(0, 0)\n");
        for(i = num-1; i >= 0; i--){//逆序输出
            printf("(%d, %d)\n", ans[i].x, ans[i].y);
        }





    }
return 0;
}

 

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

相关推荐

Rust练手:从零手撸RISC-V架构虚拟机(一)(附完整代码)

使用Rust实现一个简单的RISC-V架构的CPU雏形,支持add,sub,addi三个指令。

qq_45983373的博客 2569

广度优先搜索例题

广度优先搜索(BFS)是一种基本的暴力技术,常用于解决图、树的遍历问题。 类似于一个“扩散”的过程,如果把搜索空间看成一个池塘,丢一颗石头到起点位置,激起的波浪就会一层层扩散到整个空间。需要注意的是,扩散按从近到远的顺序进行,因此,从每个被扩散到的点到起点的路径都是最短的。这个特征对解决迷宫最短路径问题很有用。 t1poj 3278 Catch That Cow 题目大意: 农夫要去抓一只知道固定位置的牛,农夫有两种走法:1.行走:农夫可以在一分钟内从X点移动到X- 1 或X+ 1点 ...

zjsru_Beginner的博客 1646

领域驱动新实践:COLA框架全解析——架构设计与实战案例解析

定义订单支付事件java代码解读复制代码} }Order定义Order类,继承并实现支付逻辑:java代码解读复制代码} }定义接口:java代码解读复制代码定义类,处理订单支付逻辑并持久化:java代码解读复制代码} }定义和处理订单支付事件:java代码解读复制代码} }java代码解读复制代码} }定义和接口及其实现:java代码解读复制代码java代码解读复制代码。

2401_89221445的博客 2659

DFS和BFS(广度优先搜索和深度优先搜索)5个经典例子

DFS和BFS(广度优先搜索和深度优先搜索)5个经典例子 看完必会深搜和广搜

G_GUi的博客 6453

BUCK降压电路设计实战:从理论到PCB的完整指南

本文详细介绍了BUCK降压电路的设计实战,从基础原理到PCB布局的完整指南。通过关键部件选型、PCB布局黄金法则和调试技巧,帮助工程师高效设计稳定可靠的开关电源。特别针对电感、MOSFET和电容选型提供实用公式和避坑指南,并分享高温环境下的工程经验与测试方法。

weixin_33744141的博客 449

SpringBoot3 + OAuth2.1实战:5分钟搞定授权码模式(含完整代码)

本文详细介绍了如何在SpringBoot3环境中快速实现OAuth2.1的授权码模式,包括环境配置、核心安全实现及完整代码示例。通过Spring Security集成,开发者可以高效构建企业级安全认证系统,解决版本兼容性问题,提升开发效率。

weixin_29216353的博客 138

广度优先搜索(BFS)

BFS问题 简介 BFS,英文全称是 Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表) 我的理解 最早我学广度优先遍历是在二叉树里面的 层序遍历, 广度优先搜索的做法是 1.首先创建一个队列(queue), 2.把根节点的存入队

weixin_45802793的博客 1861

深入解析组合逻辑环(combinational loop)的成因与解决方案

本文深入解析了数字电路设计中组合逻辑环(combinational loop)的成因与危害。通过边沿检测和中断轮询(round_robin)仲裁器等实例,揭示了代码如何意外形成环路,并对比了插入触发器、重构逻辑以及状态机思维三种核心解决方案,帮助硬件工程师从根本上避免这一常见设计陷阱,确保电路稳定可靠。

weixin_28278377的博客 313

【算法 | 广度优先搜索】5道BFS题(解析+代码)

我们可以将广度优先搜索理解为“水波扩散”,想象一下,你在一个平静的湖面上扔了一块石头,石头落入水面的那一点,就像是广度优先搜索的起始节点。石头落水后,水面会形成一圈圈扩散开去的波纹,每一圈波纹就像是从起始节点开始,经过相同步数可以到达的所有节点。

翼同学 2847

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

2301_77123899的博客 1万+

【昇腾】用MindIE(服务化方式)拉起glm4-9b-chat模型问题解决

【昇腾】用MindIE拉起glm4-9b-chat模型问题解决: LLMInferEngine failed to init LLMInferModels ERR: Failed to init endpoint! Please check the service log or console output. Killed make sure the folder's owner has execute permission.

u014448841的博客 5116

[C++]广度优先搜索(BFS)(附例题)

广度优先搜索(BFS)(附例题)问题产生:Isenbaev是国外的一个大牛。现在有许多人要参加ACM ICPC。一共有n个组,每组3个人。同组的3个人都是队友。大家都想知道自己与大牛的最小距离是多少。大牛与自己的最小距离当然是0。大牛的队友和大牛的最小距离是1。大牛的队友的队友和大牛的最小距离是2……以此类推。如果实在和大牛没有关系的只好输出undefined了。第一行读入n。表示有n个组。1 ≤

stary_yan的博客 3万+

【即插即用模块】Transformer篇 | MICCAI 2025 | ReLULA:Q/K双ReLU线性注意力,既轻又准!

本文介绍了一种基于线性注意力的多实例学习模块(Lin-MIL),适用于高分辨率视觉任务。该模块通过转置计算顺序和使用ReLU激活,将计算复杂度从O(n²d)降至O(nd²),同时提升特征判别性。核心创新包括Q/K双ReLU激活、可学习温度系数和数值稳定归一化。实验表明,该模块在轻量化视觉任务中优于传统线性注意力和Mamba架构。代码实现了模块化矩阵乘法,支持即插即用替换ViT自注意力层。该模块特别适合计算病理学等需要处理大量图像补丁的任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 139

BFS(广度优先搜索)——搜索算法

BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。

2302_80105876的博客 3969

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

【数据结构与算法】搜索算法(深度优先搜索 DFS和广度优先搜索 BFS)以及典型算法例题

深度优先搜索 和广度优先搜索!!!【数据结构与算法】搜索算法(深度优先搜索 DFS和广度优先搜索 BFS)以及典型算法例

ChenZHIHAO_y的博客 4560

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【总结】BFS 模板总结及例题详解

广度优先搜索BFS 模板套路BFS 例题分类及题解 以下内容收集了全网以及整合了自己写的部分。 广度优先搜索 广度优先搜索算法(也称宽度优先搜索,英语:Breadth-First Sear,缩写BFS),是连通图的一种遍历策略。其思想是从一个顶点开始,辐射状地优先遍历其周围较广的区域。 DFS和BFS的区别: 深搜和广搜在实现上分别用的是栈(栈和函数递归本质是一样)和队列。一般来说,广...

360°顺滑 3634

精雕软件(JDpaint) 5.5 绿色版

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

dfs和bfs的讲解、模板和典型例题

1,概述 广度优先搜索(BFS),利用队列实现,特点是水泛涟漪; 深度优先搜索(DFS),使用递归实现(其实是用到了栈的形式,先进后出),特点是一条路走到黑; 2,代码模板实现 //DFS代码实现 void dfs(TreeNode root){ if(root==null){ return; } dfs(root.left); dfs(root.right); } //BFS代码实现 void bfs(TreeNode root){ Qu

xdbzdgx的博客 2809

BFS (Java) 广度优先搜索 简单介绍、模板、案例(一)

深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法,在各类题目中都有广泛的应用。 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。 广度优先搜索算法(Breadth-First Search,缩写为 BFS),又称为宽度优先搜索,是一种图形搜索算法。简单的说,BFS 是从根结点开始,沿着树的宽度遍历树的结点。如果所有结点均被

weixin_45532984的博客 4292

广度优先搜索遍历(BFS)在二维数组上的应用例题讲解

广度优先搜索遍历又名BFS,属于盲目搜寻法,是图的搜索算法之一,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。下面列出几道经典例题,来带领大家一同求解。 (1)给定一个由 0 和 1 组成的矩阵 mat,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。两个相邻元素间的距离为 1 。 本题意思是求解数组中每个数到数字0的距离,0自己本身的距离为0,且距离只考虑上下左右四个方向,不..

cug_cxy的博客 3802

BFS【进阶】双向广度优先搜索(Bidirectional BFS,简称双向BFS)

摘要: 双向广度优先搜索(Bidirectional BFS)通过从起点和终点同步扩展,将时间复杂度从 (O(b^d)) 优化至 (O(b^{d/2})),适用于确定终点的最短路径问题。其核心是双队列协同管理、动态选择较小队列扩展及相遇终止机制。实现需注意层级计算、队列平衡和防重复访问。典型应用包括单词接龙(LeetCode 127)和八数码问题,能显著减少搜索空间。不适用于终点未知或需记录全路径的场景。关键优势在于双向夹击策略和平方根级复杂度优化。

学习代码 1223

BFS(广度优先搜索算法)之细胞例题

目录 一 问题描述 二 解题思路 三 核心代码 四 完整代码 五 注意点 一 问题描述 例子如下:输入4行10列的矩阵,根据题意,可以输出在该例子中细胞数目共有4个 二 解题思路 三 核心代码 四 完整代码 五 注意点 ...

xiaoxi_hahaha的博客 1803

广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

普通队列BFS:适用于无权图;双端队列BFS:适用于边权为0或1且到每个顶点的边权都相等的带权图;优先队列BFS:适用于边权不为负且到每个顶点的边权都相等的带权图;如果图上到每个顶点的边权不等,则需使用最短路算法。

yuhaomogui的博客 2485

广度优先搜索详解--BFS--蒟蒻的学习之路

广度优先搜索BFS是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索,直到遍历完所有的节点。 ​

q20202828的博客 1005

BFS 广度优先搜索 解析

1.概念:        广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。 2.解析:          如果说DFS(深度优先搜索)靠的是栈,那BFS(广度优先搜索)

colorfulshark 4007

【算法笔记】广度优先搜索BFS

【算法笔记】广度优先搜索BFS例题1思路代码例题2思路代码提示 广度优先搜索一般由队列实现,且总是按层次的顺序进行遍历,基本写法如下: void BFS(int s){ queue<int> q; q.push(s); //定义一个队列q,并将起点s入队 //队列q非空 while(!q.empty()){ 取出队首元素top; 访问队首元素top; 将队首元素出队; 将top的下一层结点中未曾入队的结点全部入队,并设置为已入队; //标记层号为now的层号+1,同

null 1945

广度优先搜索(BFS)算法:原理、应用与 Java 实现

广度优先搜索(BFS)是一种重要的图遍历算法,具有广泛的应用场景。通过迭代实现,BFS 可以有效地探索图中的所有节点。

小L的博客 2238
上一篇: 求数组(连续)在某一区间最大值(简单的动态规划的思想)
下一篇: HashSet简单讲解
Re:fused
博客等级 码龄9年 474粉丝 162原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值