Z1. 广度优先搜索(BFS)解题思路
/**
BFS 解题思路
特点:从某些特定的节点开始,感染相邻的节点; 被感染的节点,再感染其相邻的节点,以此类推。
题目常见于数据结构包括 二维数组、树、图
**/ /**
1). 二维数组特定节点感染相邻的节点,即上下左右四个方向,可设定变化数组如下
int[] dr = new int[]{-1, 0, 1, 0};
int[] dc = new int[]{0, -1, 0, 1};
2). 二维数组特定节点感染包围它的节点,即八个方法, 可设定变化数组如下:
int[] dr = new int[]{-1, -1, -1, 0, 0, 1, 1, 1};
int[] dc = new int[]{-1, 0, 1, -1, 1, -1, 0, 1};
**/ //BFS的目的是通过遍历特定节点及可能被感染的节点,以计算出要求的结果。可能求最大最小值,也可能是统计数量等等。
//这里定义一个内部类来存储每个节点的坐标及计算结果。
class Node{
int r;
int c;
int val;
public Node(int r, int c, int val){
this.r = r;
this.c = c;
this.val = val;
}
}
//定义一个队列(FIFO, 先进先出)来存储所有涉及的节点
Queue<Node> queue = new LinkedList<Node>();
//遍历二维数组 grid
int R = grid.length, C = grid[0].length;
for(int r = 0; r < R; r++){
for(int c = 0; c < C; c++){
//isNeedToAdd 按实际实现,一般由索引值和实际值两种因素决定
if(isNeedToAdd(r, c, grid[r][c])){
int val = ...;//计算出结果
queue.add(new Node(r, c, val));
}
}
}
//BFS
//注意:BFS 不一定就直接得出最终的答案,可能得到的是最终答案的前置变量, 这里需要分析一下从 BFS 得到的结果如何可以转换到最终答案。
//定义最终结果变量 ans
int ans = 0;
while(!queue.isEmpty()){
Node node = queue.poll();
for(int k = 0; k < 4; k++){
int nr = node.r + dr[k];
int nc = node.c + dr[k];
//首先需要判断边界
if(nr >= 0 && nr < R && nc >= 0 && nc < C){
//备忘录判断:为了不重复处理已搜查过的节点
//备忘录处理方法有几种:1. 改变已搜查过的节点的值,通过值进行判断, 这种方法不占用额外存储空间; 2. 使用哈希表
if(!memoExist(nr, nc, grid[nr][nc])){//备忘录不存在则继续
addToMemo();//加入备忘录
int nval = ....;//计算出结果
ans = ....;//使用中间结果计算出最后结果,例如求最大值 ans = Math.max(ans, nval);
queue.add(new Node(nr, nc, nval))
}
}
}
}
很多题目如果分析出来可以使用广度优先搜索(BFS)来解决,需要思考好以下几个问题:
- 节点类的设计,需要分析好数据的特征
- 分析初始数据中的特定节点,将其加入到队列中。如果初始队列数据后面需要用到的话,可以考虑存储两份,一份用于搜索相邻节点(使用队列存储),一份用于后期得到最终答案(根据实际问题选择数据结构)。
- 分析特定节点如何转换为相邻节点。
- 分析从 BFS 可以得到什么结果,这些结果如何转换为最终答案(最关键的一步)
- 注意边界问题和使用备忘录,避免错误搜索和重复搜索。
哪些问题适合使用 BFS:
- 求从根节点到达某一节点的最短路径
- 感染相邻(一般这类题目也可以使用深度优先算法 DFS)
Z1. 广度优先搜索(BFS)解题思路的更多相关文章
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
随机推荐
- Cogs 1714. [POJ1741][男人八题]树上的点对(点分治)
[POJ1741][男人八题]树上的点对 ★★★ 输入文件:poj1741_tree.in 输出文件:poj1741_tree.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] ...
- epoll事件模型
事件模型 EPOLL事件有两种模型: Edge Triggered (ET) 边缘触发只有数据到来才触发,不管缓存区中是否还有数据. Level Triggered (LT) 水平触发只要有数据都会触 ...
- codeforces164A
Variable, or There and Back Again CodeForces - 164A Life is not easy for the perfectly common variab ...
- ArrayUtils.
String sfck=mp.get("SFCK")==null?"":mp.get("SFCK").toString(); Str ...
- fluent中如何对一个非整个volume的特定的区域进行数据分析?【转载】
作者:王蒙 链接:https://www.zhihu.com/question/37432813 来源:知乎 很抱歉,我不知道 fluent 中是否有这一功能,我这个学期才开始学.但 CFD-Post ...
- IDEA的版本控制
参考:https://blog.csdn.net/qq_35246620/article/details/70792861 1.从远程仓库下载项目 2.提交项目到远程仓库
- 火狐调试工具-DevTools
狐调试工具 - DevTools 咱们做写js 代码的时候,遇到的一个最大的问题就是调试问题,很多开发者在写 js 代码的时候,经常都非常痛苦.但是我们如果掌握好相应的调试工具,那么就可以比较游刃有余 ...
- arcgis python 获得打印机
class ToolValidator: """Class for validating a tool's parameter values and controllin ...
- c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一、连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程
c3p0数据库连接池 原创: Java之行 Java之行 5月8日 一.连接池概述 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 DB连接池HikariCP为什么如此快 原创: D ...
- 《高性能mysql》笔记(第一章,mysql的架构与历史)
mysql的服务器逻辑架构图如下: 目前工作用的5.5版本,5.5版本开始mysql开始将innoDB作为默认的存储引擎,innoDB的表是基于聚簇索引建立的. mysql的存储引擎锁管理非常重要,在 ...