宽度优先搜索

又有的时候,我们还会碰到这样一些貌似可以用深搜解决,但又有点茫然打不出深搜程序的题:奇怪的电梯、倒牛奶、面积……这些问题,问的都是最怎么怎么样,但也是从一个起点出发往下走。怎么办?这时候我们就要用到一个新的算法。虽然也叫搜索,但它并没有回溯这个操作。它和深度优先搜索一样,有个昵称:广度优先搜索。当然了,它肯定有个正式名称,那就是

宽度优先搜索(BFS,简称宽搜)

那么,宽度优先搜索又是个什么东西?它和深度优先搜索又有什么区别?我会在这里一一介绍。


一、宽度优先搜索的思想

宽度优先搜索是从一个节点(位置)出发,拓展出所有它可以拓展出来的节点(位置)。接着,指针移到下一个位置,对这个位置继续进行拓展,然后指针再移到下一个位置,再继续拓展……直到找到答案为止。
它和深度优先搜索不同,深度优先搜索是“往死里走”,宽度优先搜索则是不紧不慢地,先拓展完一个再拓展另一个。


二、宽度优先搜索的基本用途

宽度优先搜索一般在“最值问题”中会大显身手,当然在总的方案问题中也占有一席之地(当深搜会爆栈时)。在图论问题中,它也经常用来遍历一个图;树的遍历,有时也会用来完成。


三、宽度优先搜索的写法

与深搜不同,宽搜一般用while循环来实现。宽度优先搜索其实相当于创建一个队列(或者说填充数组),要用两个指针i,j。i表示当前正在拓展的节点(位置),j表示这个数组的终点。
以下是宽度优先搜索的框架:

初始化data、i=0、j=1和标记(凡是搜索都离不开标记这个玩意儿,一定要记住!不然Runtime Error或者Time Limit Exceeded别怪我没说过!)
while(i<j)//即还有节点可以拓展
{i++;for(int s=1;s<=方向个数(或者说可以拓展的节点数量,譬如说假如是走迷宫,那么就有四个或者八个方向;如果是电梯上下,那么就有上和下两个方向);s++)if(满足条件且拓展的新节点没被访问过){j++;拓展新节点;记录步数;标记;if(新节点==目标节点) printf步数,退出;(如果是求总的方案,则ans++}
}

为什么发现到目标节点了,所用步数就一定是最少的呢?
因为宽度搜索是一层一层的遍历,如果找到了一个目标节点,那么它一定是用最少步数找到的。
(高阶亿点的解释,把宽度优先搜索的结果列成一个图,就变成了一棵树,步数就是这个节点在这棵树的层数,而这个层数一定是离根节点(起点)最短的。)


四、使用宽搜的注意事项

  1. 记录每一个节点数据的打他data数组一定要开大,一定要保证装的下所有可能的状态(本人就有不少于5次因为data没开够而Runtime Error的前车之鉴)当你发现空间不够时,别心软,把它踢一边去(换一个新的算法)!
  2. 当你发现一道题可以用深搜也可以用宽搜(并且两者都是100%能拿100分)时,你就要量力而行了,自己擅长用哪个算法就用哪个算法(本人喜欢用深搜,你们的程序你们做主哈
  3. 宽度优先搜索的标记一定要深思熟虑之后再定,要仔细想清楚标记表示什么意思(一般一个数据有几个量就用几维,但是有些情况量太多,这时候要想清楚用什么做标记)。

总而言之,宽度优先搜索虽然比起深搜来小众那么一点点,但它还是很常用的。大家一定要好好学好BFS哟!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB安装及接入springboot

环境&#xff1a;windows、jdk8、springboot2 1.MongoDB概述 MongoDB是一个开源、高性能、无模式&#xff08;模式自由&#xff09;的文档&#xff08;Bson&#xff09;型数据库&#xff1b;其特点如下&#xff1a; 模式自由 ---- 不需要提前创建表 直接放数据就可以 支持高并…

STM32窗口看门狗的操作

STM32的窗口看门狗的主要功能是&#xff0c;程序过早的喂狗还有太晚喂狗&#xff0c;都会触发单片机重启&#xff0c;就是有一个时间段&#xff0c;在这个时间段内喂狗才不会触发单片机重启。 下面我就总结一下窗口看门狗的设置过程&#xff1a; 第一步&#xff1a;开启窗口看…

css基础之定位、元素的显示与隐藏

定位 一、定位position组成 定义定位模式边偏移&#xff0c; 1.定位模式用于指定一个元素在文档中的定位方式 通过css的positon属性设置&#xff0c;其值分为四个: 静态定位&#xff1a;static 相对定位&#xff1a;relative 绝对定位&#xff1a;absolute 固定定位&#x…

读书笔记——《高质量C++/C编程指南》(5)

目录 前言 类的构造函数、析构函数与赋值函数 构造函数与析构函数的起源 构造函数的初始化表 构造和析构的次序 示例&#xff1a;类String 的构造函数与析构函数 不要轻视拷贝构造函数与赋值函数 示例&#xff1a;类String 的拷贝构造函数与赋值函数 偷懒的办法处理拷贝…

vscode怎么设置背景图片?

vscode背景图片是可以自己设置的&#xff0c;软件安装后默认背景的颜色是黑色的&#xff0c;这是默认的设计&#xff0c;如果要修改背景为指定的图片&#xff0c;那么我们需要安装插件&#xff0c;然后再通过代码来设置背景图片的样式&#xff0c;下面我们就来看看详细的教程。…

代数结构:5、格与布尔代数

16.1 偏序与格 偏序集&#xff1a;设P是集合&#xff0c;P上的二元关系“≤”满足以下三个条件&#xff0c;则称“≤”是P上的偏序关系&#xff08;或部分序关系&#xff09; &#xff08;1&#xff09;自反性&#xff1a;a≤a&#xff0c;∀a∈P&#xff1b; &#xff08;2…

旅游推荐管理系统(小组项目)

文章目录 前言 一、项目介绍 1. 项目目的 2. 项目意义 2.1 提升旅游体验 2.2 促进旅游业发展 2.3 数据积累与分析 2.4 提升服务品质 2.5 优化资源配置 二、项目结构 1. 主要使用的技术 1.1 若依&#xff08;Ruoyi&#xff09;框架 1.2 Vue.js框架 1.3 Ajax 1.4 …

OpenCV 阈值法

1.概述 在深度学习出现之前&#xff0c;图像中的阈值法处理主要有二值阈值法、自适应阈值法、Ostu阈值法。 2.理论对比 3.代码实现 #include <iostream> #include <opencv2/opencv.hpp>int main(int argc, char** argv) {if(argc ! 2) {std::cerr << "…

【进程通信】了解信号以及信号的产生

文章目录 0.前言1.信号的基本概念1.1中断1.1.1 软中断1.1.2硬中断 1.2异步1.2.1异步和同步的比较 2.信号的主要用途3.信号的特点4.查看信号4.1Core和Term的区别4.2生成Core文件 5.初识捕捉信号5.1signal函数 6.产生信号的方式6.1.通过终端按键产生信号6.2.调用系统函数向进程发…

隆重庆贺中华人民共和国成立七十五周年,中国科学技术大学全体师生祝福祖国强盛

隆重庆贺中华人民共和国成立七十五周年中国科学技术大学全体师生祝福祖国强盛卡西莫多 华夏曾经炮声隆 亿万黎民饥寒重 列强瓜分举杯庆 条约割肉斟血贺 饕餮盛宴沃野中 地大物博多浮华 曾多膏脂送肉人 我辈悲苦先祖民 曾经如此患难共 皆因内乱又失和 才致如此覆巢国 领袖聚沙垒…

使用 TensorFlow.js 和 OffscreenCanvas 实现实时防挡脸弹幕

首先&#xff0c;要理解我们的目标&#xff0c;我们将实时获取视频中的面部区域并将其周围的内容转为不透明以制造出弹幕的“遮挡效应”。 步骤一&#xff1a;环境准备 我们将使用 TensorFlow.js 的 Body-segmentation 库来完成面部识别部分&#xff0c;并使用 OffscreenCanv…

tvm.frontend.from_pytorch详细介绍(1)

文章目录 一、pytorch前端整体转化流程&#xff08;部分&#xff09;1.脚本化的pytorch模型2.内联优化(_run_jit_passes)2.1、内联优化2.2 什么是内联函数 3.graph中的所有op(get_all_op_names)3.1 各个变量的值1 .graph2 .nodes3 .p nodes4、返回结果 二、from_pytorch完整代码…

国内智能搜索工具实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

3、Qt--配置文件的使用

开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 一、需求及方案 实际开发过程中&#xff0c;我们需要根据本地的配置文件&#xff0c;去配置我们的程序&#xff0c;比如数据库地址、网络地址等信息&…

分享10类正规的网上赚钱平台,让你摆脱单一收入

在这个互联网飞速发展的时代&#xff0c;你是否还在为单一的收入来源而焦虑&#xff1f;别担心&#xff0c;今天带你解锁10种网上赚钱的新姿势&#xff0c;让你的收入不再单一&#xff0c;甚至可能翻倍&#xff01; 1. 文库类&#xff1a;知识的变现 你知道吗&#xff1f;你的…

k8s 数据流向 与 核心概念详细介绍

目录 一 k8s 数据流向 1&#xff0c;超级详细版 2&#xff0c;核心主键及含义 3&#xff0c;K8S 创建Pod 流程 4&#xff0c;用户访问流程 二 Kubernetes 核心概念 1&#xff0c;Pod 1.1 Pod 是什么 1.2 pod 与容器的关系 1.3 pod中容器 的通信 2&#xff0c; …

imx91的uboot编译

一、准备操作 下载半导体厂家的uboot源码 如这里我要下载的是imx91的恩智浦linux芯片bootloader 进入半导体厂家官网 下载源码&#xff0c;略 更新linux源&#xff0c;这里我是替换成清华源 vi /etc/apt/sources.list deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ fo…

【江科大STM32学习笔记】新建工程

1.建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 2.工程文件夹里建立Start、Library、User等文件夹&#xff0c;复制固件库里面的文件到工程文件夹 为添加工程文件准备&#xff0c;建文件夹是因为文件比较多需要分类管理&#xff0c;需要用到的文件一定要复…

Web UI自动化测试--PO模式

没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…

完全背包问题(c++)

完全背包问题 当前有 N 种物品&#xff0c;第 i 种物品的体积是 ci​&#xff0c;价值是 wi​。 每种物品的数量都是无限的&#xff0c;可以选择任意数量放入背包。 现有容量为 V 的背包&#xff0c;请你放入若干物品&#xff0c;使总体积不超过 V&#xff0c;并且总价值尽可…