0-1BFS 双端队列 广度优先搜索

一. BFS及0-1BFS的简单介绍 

        深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法,在各类题目中都有广泛的应用。

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

        一般来说,能用DFS的,一般都可以用BFS解决,反过来同理。但是不同的题目,对于DFS和BFS的复杂度可能是有些差别的,对于有些题目,用BFS更容易解决,会有更少的时间复杂度。

        在上文:

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

中,给出了BFS的简单介绍,模板和相关案例。那么在本文中,主要来介绍0-1BFS,或者说双端队列BFS。对于简单的BFS类题目,我们在队列尾部进行一直添加即可,但有些题目则不能满足需求,需要在头尾进行添加或者删除元素,我们称作0-1BFS或者双端队列BFS,而对于头尾的操作,可能是不同的,比如头不增加深度,而尾增加深度。

二. 简单模板

class Solution {public BFS(TreeNode root) {//双端队列,用来存储元素Deque<TreeNode> queue = new ArrayDeque<>();//添加首个元素queue.add(首个元素);//当队列不为空一直进行循环,直到队列不再有元素while(!queue.isEmpty()){if(限制条件){头操作,更新深度,或者相反;} else{尾操作,不更新深度,或者相反;}   }返回答案;}
}

 

三. 案例

leetcode 1263 推箱子

「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。

游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。

现在你将作为玩家参与游戏,按规则将箱子 'B' 移动到目标位置 'T' :

玩家用字符 'S' 表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。
地板用字符 '.' 表示,意味着可以自由行走。
墙用字符 '#' 表示,意味着障碍物,不能通行。 
箱子仅有一个,用字符 'B' 表示。相应地,网格上有一个目标位置 'T'。
玩家需要站在箱子旁边,然后沿着箱子的方向进行移动,此时箱子会被移动到相邻的地板单元格。记作一次「推动」。
玩家无法越过箱子。
返回将箱子推到目标位置的最小 推动 次数,如果无法做到,请返回 -1。

输入:grid = [["#","#","#","#","#","#"],["#","T","#","#","#","#"],["#",".",".","B",".","#"],["#",".","#","#",".","#"],["#",".",".",".","S","#"],["#","#","#","#","#","#"]]
输出:3
解释:我们只需要返回推箱子的次数。

class Solution {int row;int col;char[][] grid;public int minPushBox(char[][] grid) {//初始化this.grid = grid;row = grid.length;col = grid[0].length;int pi = 0, pj = 0, bi = 0, bj = 0;for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(grid[i][j] == 'S'){pi = i;pj = j;}if(grid[i][j] == 'B'){bi = i;bj = j;}}}int[] dirs = new int[]{-1,0,1,0,-1};Deque<int[]> q = new ArrayDeque<>();boolean[][] vis = new boolean[row*col][row*col];q.offer(new int[]{get(pi, pj), get(bi,bj), 0});vis[get(pi,pj)][get(bi,bj)] = true;while(!q.isEmpty()){var p = q.poll();int d = p[2];bi = p[1]/col;bj = p[1]%col;pi = p[0]/col;pj = p[0]%col;if(grid[bi][bj] == 'T'){return d;}for(int k = 0; k < 4; k++){int px = pi + dirs[k];int py = pj + dirs[k+1];if(!check(px,py)){continue;}if(px == bi && py == bj){int bx = bi + dirs[k];int by = bj + dirs[k+1];if(!check(bx,by) || vis[get(px,py)][get(bx,by)]){continue;}vis[get(px,py)][get(bx,by)] = true;q.offer(new int[]{get(px,py), get(bx,by), d+1});}else if(!vis[get(px,py)][get(bi, bj)]){vis[get(px,py)][get(bi, bj)] = true;q.offerFirst(new int[]{get(px,py), get(bi,bj), d});}}}return -1;}public int get(int i, int j){//映射return i*col + j;}public boolean check(int i, int j){//检查坐标是否合规return i >= 0 && i < row && j >= 0 && j < col && grid[i][j] != '#';}
}

本题小结:(1)判断新位置{px,py}和箱子{bi,bj}位置是否相同,相同则证明能推动箱子

               (2)推动箱子,则深度+1,即对应推动次数,添加至尾部

               (3)未推动箱子,深度不变,添加至头部

练习题目:

leetcode 1368. 使网格图至少有一条有效路径的最小代价
leetcode 2290. 到达角落需要移除障碍物的最小数目

参考来源

 [1] leetcode ylb [Python3/Java/C++/Go/TypeScript] 一题一解:双端队列 BFS(清晰题解)

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

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

相关文章

【DBA专属】mysql-------->>>MMM高可用集群架构

Mysql---MMM高可用集群架构 目录 MMM安装部署 环境配置&#xff1a;&#xff08;所有主机配置&#xff09; 1、主机信息 2、关闭防火墙 3、同步时区 4、配置主机解析文件 5、配置ssh免密登录 6、所有机器安装epel源 数据库配置&#xff1a; 【所有数据库均做的配置】…

【探索 Kubernetes|作业管理篇 系列 9】Pod 的服务对象

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们介绍了 Pod 的生命周期以及区分 Pod 字段的层次级别&#xff0c;相信你对此有了充分的认识。 今天&#xff0c;我们还会接着以 Pod 展开&#xff0c;说说它的 “服务对象”&#xff0c;一听就知道是对 Pod 提…

Vuforia专题:设置AR摄像头自动对焦

Vuforia专题&#xff1a;设置AR摄像头自动对焦 一&#xff0c;前言 在之前使用的时候&#xff0c;如果没有设置自动对焦可以发现&#xff0c;摄像头画面极其模糊。并导致识别的结果不是很理想 加上自动对焦后的效果如下&#xff1a; 二、具体步骤 1、ARCamera添加脚本Cam…

嵌入式中C++开发的基本操作方法

第一&#xff1a;面向对象 1、配置环境 虚拟机上网&#xff08;ping www.baidu.com&#xff09;sudo apt-get update //更新软件包sudo apt-get install -f //更新软件依赖sudo apt-get install g //安装c编译器 2、C发展 c98,第一版 c03,c11,c17 3、为什么学习C 4、面向对…

计算机网络——网络层

序言 计算机网络中的网络层在当今的社会起到了什么作用&#xff1f; 现在的互联网通信&#xff0c;远程办公和远程教育&#xff0c;电子商务和在线服务&#xff0c;信息共享和社交媒体&#xff0c;物联网和智能家居都是通过网络层才能使用的。它连接了人们、设备和信息&#xf…

MyBatis 执行流程详解及示例代码

导言&#xff1a; MyBatis 是一个优秀的持久层框架&#xff0c;它简化了数据库操作的开发过程。本文将详细介绍 MyBatis 的执行流程&#xff0c;并提供相应的示例代码&#xff0c;帮助读者更好地理解和应用 MyBatis。 1. 创建 SqlSessionFactoryBuilder 对象 在 MyBatis 中&…

【SpringCloud学习笔记】gateway网关

gateway网关 核心概念&#xff1a; 路由&#xff08;route&#xff09;&#xff1a;路由信息由 D、目标 RI、一组断言和一组过滤器组成。如果断言路由为真&#xff0c;则说明请求的 URI 和配配断言&#xff08;predicate&#xff09;&#xff1a; Java8 中的断言函数&#xf…

总结911

目标规划&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化5讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做 1.回诵之前文章 2.每日长难句&#xff0c;句句…

人工智能(1):机器学习工作流程

1 什么是机器学习 机器学习是从数据中自动分析获得模型&#xff0c;并利用模型对未知数据进行预测。 2 机器学习工作流程 机器学习工作流程总结 1 获取数据 2 数据基本处理 3 特征工程 4 机器学习(模型训练) 5 模型评估 结果达到要求&#xff0c;上线服务没有达到要求&a…

1.2g可视化大屏项目分享【包含数字孪生、视频监控、智慧城市、智慧交通等】

1.2g可视化大屏项目分享【包含数字孪生、视频监控、智慧城市、智慧交通等】 链接&#xff1a;https://pan.baidu.com/s/1KSNll7b6bVoVPPqcQmNKeQ 提取码&#xff1a;w13x

计算机组成原理(期末或考研备考)-计算机系统概述重点

1.1计算机发展历程 讲解视频&#xff1a; https://www.bilibili.com/video/BV15s4y1F7eC/?spm_id_from333.999.0.0 1946第一台电子数字计算机(ENIAC)第一代计算机&#xff08;1946-1957&#xff09;-- 电子管&#xff1b;体积大&#xff0c;容量小&#xff0c;成本高&#x…

Tomcat的部署和优化

目录 一、Tomcat简介 二、Tomcat 的构成 三、Tomcat 功能组件结构 四、Tomcat 请求过程 五、Tomcat 服务部署 六、Tomcat 虚拟主机配置 七、Tomcat优化 1.Tomcat 配置文件参数优化 2.JVM优化 一、Tomcat简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个…