Acwing BFS

一般通过队列实现,当边的权值相同时具有最短性,可以求最少操作步数。相比DFS无需回溯,而是逐层搜索。

Acwing 844 走迷宫

在这里插入图片描述
输入样例:

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

思路分析:广度优先搜索

  • 设置一个二维数组g[][]存储图,设置一个队列q[](pair<int,int>类型的,每个值存储坐标(x,y)),表示当前到达的坐标位置,设置一个距离数组d[][],d[x][y]表示到原点的距离
  • 当队列不为空时,取出队头元素,像四个方位进行判断,看是否可走,可走的路径更新距离,坐标存入数组;
    • 关于方位的选择,为简化代码,不用写四行判断来检验每个方位。设置两个一维数组dx[4]={0,1,0,-1},dy = {1,0,-1,0},然后循环四次,每次坐标加上对应的dx、dy,判断当前位置是否可走,若可走就更新坐标到原点的距离d[x][y]+1,并将新坐标加入队列;

具体实现代码(详解版):

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 110;
typedef pair<int,int> PII;
int n,m;
int g[N][N],d[N][N];//存图和距离
PII q[N * N];//数组模拟队列int bfs(){memset(d,-1,sizeof d);//初始化距离为-1 表示当前坐标未走过d[0][0] = 0;q[0]={0,0};//队列初始化int hh = 0,tt = 0;//队头,队尾int dx[4] = {0,1,0,-1},dy[4]={-1,0,1,0};//上下左右四个方向while(hh <= tt){//队列不为空auto t = q[hh ++];//取出队头元素for(int i = 0; i < 4 ;i ++){//四个方位循环判断哪条可走int  x = t.first + dx[i],y = t.second + dy[i];//得到新坐标if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y]  == -1){//这个坐标可以走d[x][y] = d[t.first][t.second] + 1;//更新距离加1q[++tt] = {x,y};//当前坐标入队}}}return d[n-1][m-1];
}int main(){cin >> n >> m;for(int i = 0 ; i < n; i ++){for(int j = 0 ; j < m ;j ++){cin >> g[i][j];}}cout << bfs() << endl;
}

若想要存储经过的路径,可以设置一个p[][](PII),p[x][y]存储当前位置坐标的前驱坐标,判断好要走的方位时,更新,然后从(n-1,m-1)开始遍历输出,即为从终点到原点经过的坐标

II p[N][N];
if(x>=0 && y>=0 && x<n && y<m && g[x][y]==0 && d[x][y]==-1){d[x][y]=d[t.first][t.second]+1;q[tt++]={x,y};p[x][y]=t;//记录当前坐标的前驱坐标 即从哪个点过来的}
//输出
int x=n-1,y=m-1;//终点到原点的路径输出
while(x || y){cout<<x<<","<<y<<endl;auto t=p[x][y];//得到前驱x=t.first,y=t.second;
}

Acwing 845 .八数码问题

在这里插入图片描述
在这里插入图片描述

实现思路:

  • 首先题意:在这里插入图片描述
  • 可以转化为求图的最短距离,且权值为1,使用BFS;
  • 怎么表示状态(即每次移动后的矩阵是怎样的):
    • 将3*3的矩阵按顺序转化为字符串,即s=“123x46758”;
    • BFS要使用队列,这时候队列就存储字符串queue<string>
  • 如何记录到达每一个状态时移动的距离:使用一个字典,使用一个字典,字符串状态与已经移动的距离相对应,即unordered_map<string,int>
  • 然后按照BFS的步骤进行
    • 初始状态入队列,并且使用哈希表 unordered_map 来记录每个状态的步数。
    • 每次从队列中取出当前状态,检查是否是目标状态。如果是,则返回步数。
    • 否则,将当前状态的空格 x 移动到四个方向之一(上下左右),生成新的状态。
    • 如果新状态未出现过,记录该状态并将其入队,继续下一轮搜索
  • 初始状态是通过输入的字符串形成的 start,目标状态是固定的 end = “12345678x”。每次从队列中取出当前状态,找到空格 x的位置,然后尝试将空格与相邻的数字交换,并生成新的状态。记录新状态的步数,如果达到目标状态则返回结果。

注意:

  • 字符串下标k---->矩阵位置(x,y)x=k/3,y=k%3
  • 矩阵位置(x,y)---->字符串下标kk=x*3+y

具体实现代码(详解版):

#include <iostream>
#include <algorithm>
#include <queue>
#include <unordered_map>using namespace std;int bfs(string start) {// 定义目标状态string end = "12345678x";// 定义字符串队列queue<string> q;q.push(start);  // 初始状态入队// 定义距离哈希表,记录每个状态的步数unordered_map<string, int> d;d[start] = 0;  // 初始状态的步数为 0// 四个方向的移动偏移int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};// BFS 遍历while (q.size()) {auto t = q.front();  // 取出队头元素q.pop();int dist = d[t];  // 得到当前状态的步数// 如果当前状态已经是目标状态,返回步数if (t == end) return dist;// 找到 'x' 的位置int k = t.find('x');int x = k / 3, y = k % 3;  // 将一维索引转换为二维坐标// 遍历四个方向for (int i = 0; i < 4; i++) {int a = x + dx[i], b = y + dy[i];// 检查新的坐标是否在有效范围内if (a >= 0 && a < 3 && b >= 0 && b < 3) {swap(t[k], t[a * 3 + b]);  // 交换 'x' 和相邻位置的数// 如果新状态没有被访问过,将其入队并记录步数if (!d.count(t)) {d[t] = dist + 1;q.push(t);}// 还原状态,为下一个方向的移动做准备swap(t[k], t[a * 3 + b]);}}}return -1;  // 如果不能到达目标状态,返回 -1
}int main() {string start;// 输入初始状态的 9 个字符for (int i = 0; i < 9; i++) {char c;cin >> c;start += c;}// 输出最少的移动次数cout << bfs(start) << endl;
}

BFS(广度优先搜索)总结

广度优先搜索(BFS)是一种图遍历算法,适用于求解最短路径、连通性、搜索层次结构等问题。它从起始点开始,逐层遍历每一层的所有相邻节点,直到找到目标节点或遍历完整个图。BFS是无权图中计算最短路径的有效方法。广度优先搜索是一种高效且简单的图遍历算法,适用于求解无权图中的最短路径问题。通过使用队列,BFS能够按层次遍历图中的节点,保证最短路径的求解。在实际问题中,如迷宫、拼图、连通性检查等,BFS是常用的算法之一。

DFS与BFS的对比理解
BFS(广度优先搜索)和 DFS(深度优先搜索)是两种经典的图遍历算法,它们在遍历顺序、应用场景、实现方式和性能上都有显著的不同。下面将从多个角度对这两种算法进行详细对比。

  • 遍历顺序
    • BFS(广度优先搜索):从起点出发,优先遍历距离起点最近的节点,逐层扩展,直到遍历完所有节点或者找到目标节点。BFS通常用于按层次遍历节点;
    • DFS(深度优先搜索):从起点出发,一直深入到某条路径的尽头,直到无法继续为止,再回溯到上一个分支点并继续探索其他路径。DFS是先走“深”的节点,后处理“宽”的节点;
  • 搜索路径和解的性质
    • BFS:适合用于寻找无权图中的最短路径,因为BFS按照层次逐层扩展,首先到达某个节点的路径一定是最短路径。它遍历到某一层时,会访问到该层所有的节点;
    • DFS:适合用于寻找所有解或者进行路径探索,但它不保证找到的是最短路径。如果问题需要找到全部解或者对图中的某些部分进行深度探索,DFS更有效;
  • 数据结构
    • BFS:依赖于队列,队列保证了先入先出的顺序,确保节点是按层次遍历的。新发现的节点会在队列的末尾等待被访问;
    • DFS:依赖于栈,可以用递归或者显式栈来实现。DFS通过栈的后入先出性质,能够优先深入到图的最深处;
      在这里插入图片描述
      以上就是BFS的一些知识和练习,注意与DFS进行对比学习~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146915.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

[今日Arxiv] 思维迭代:利用内心对话进行自主大型语言模型推理

思维迭代&#xff1a;利用内心对话进行自主大型语言模型推理 Iteration of Thought: Leveraging Inner Dialogue for Autonomous Large Language Model Reasoning URL&#xff1a;https://arxiv.org/abs/2409.12618 注&#xff1a;翻译可能存在误差&#xff0c;详细内容建议…

Java -2

常用API System 可以获取当前时间&#xff0c;以此计算运行代码的时间也可以控制代码的结束 //获取当前时间点-毫秒 1970 1-1 8:00 long num System.currentTimeMillis(); System.out.println(num);//系统退出运行 System.exit(0); Runtime 获取操作系统的线程大小 能从操…

YOLOv8改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

Tansformer代码实现

目录 1.Tansformer架构图 2.代码实现 2.1创建类&#xff1a;实现基于位置的前馈网络 2.2创建 残差&LN层标准归一化的类 2.3编码器block 2.4创建编码器 2.5创建解码器 2.6transformer解码器部分 3.知识点个人理解 1.Tansformer架构图 2.代码实现 2.1创建类&…

连续数组问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路&#xff1a; 思路&#xff1a;前缀和&#xff08;第二种&#xff09;化0为-1hash&#xff1a; 这样可以把…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

vscode 配置django

创建运行环境 使用pip安装Django&#xff1a;pip install django。 创建一个新的Django项目&#xff1a;django-admin startproject myproject。 打开VSCode&#xff0c;并在项目文件夹中打开终端。 在VSCode中安装Python扩展&#xff08;如果尚未安装&#xff09;。 在项…

滑动窗口经典题目

目录 滑动窗口 什么是滑动窗口&#xff1f; 什么时候用滑动窗口&#xff1f; 怎么用滑动窗口&#xff1f; 209. 长度最小的子数组&#xff08;滑动窗口的引入&#xff09; 3. 无重复字符的最长子串 1004. 最大连续1的个数 III 1658. 将 x 减到 0 的最小操作数 904. 水…

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数&#xff08;Aggregate Functions&#xff09;在数据库查询中扮演着至关重要的角色&#xff0c;特别是在处理大量数据时。它们能够对一组值执行计算&a…

37. Vector3与模型位置、缩放属性

本文章给通过组对象Group (opens new window)给大家讲解一下threejs层级模型或树结构的概念。 Group层级模型(树结构)案例 下面代码创建了两个网格模型mesh1、mesh2&#xff0c;通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象g…

Vuex的使用看这一篇就够了

Vuex概述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以一种可预测的方式来保证状态以一种可预测的方式发生变化。 state状态 把公用的数据放到store里的state就行了&#xff0c;上面是vue2的代码&#xff0c;下…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION&#xff0c;它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

【前端】ES6:Class语法和Class继承

文章目录 1 Class语法1.1 类的写法1.2 getter与setter1.3 静态属性和静态方法 2 Class继承 1 Class语法 1.1 类的写法 class Person {constructor(name,age){this.name name;this.age age;}say(){console.log(this.name,this.age)} } let obj new Person("kerwin&quo…

python--基础语法(2)

1.顺序语句 默认情况下&#xff0c;Python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 2.条件语句 条件语句能够表达“如果 ...否则 ...”这样的语义这构成了计算机中基础的逻辑判定条件语&#xff0c; 也叫做 分支语句。表示了接下来的逻辑可能有几种走向…

SysML图例-10cm最小航天器AC-10

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> SysML图中词汇 AC10 AeroCube-10&#xff0c;大小仅为10 10 15 cm的卫星&#xff0c;更多信息参见下文&#xff1a; AeroCube-10成为迄今为止完成在轨接近操作的最小航天…

yolov8模型在手部关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在手部关键点检测识别中的应用【代码数据集python环境GUI系统】 背景意义 在手势识别、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;手部关键点检测为用户提供了更加自然、直观的交互方式。通过检测手部关键点&#…

移动登录页:让用户开启一段美好的旅程吧。

Hi,大家好&#xff0c;我是大千UI工场&#xff0c;移动登录页千千万&#xff0c;这里最好看&#xff0c;本期分享一批移动端的登录页面&#xff0c;供大家欣赏。 本次分享的是毛玻璃/3D风格的登录页。

Linux文件IO(七)-复制文件描述符

在 Linux 系统中&#xff0c;open 返回得到的文件描述符 fd 可以进行复制&#xff0c;复制成功之后可以得到一个新的文件描述符&#xff0c;使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作&#xff0c;复制得到的文件描述符和旧的文件描述符拥有相同的权限&#…