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)

原文地址:https://www.cnblogs.com/zlxyt/p/11403358.html

时间: 2024-08-09 09:06:24

Z1. 广度优先搜索(BFS)解题思路的相关文章

算法与数据结构基础 - 广度优先搜索(BFS)

BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi

广度优先搜索(BFS)

广度优先 Description: 阿狸被困在迷宫,snoopy要去救他,snoopy可以向上.下.左.右四个方向行走,每走一步(格)就要喝掉一瓶益力多.现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫? Input: 先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n. 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

深度优先搜索DFS和广度优先搜索BFS

DFS简介 深度优先搜索,从起点开始按照某个原则一直往深处走,直到找到解,或者走不下去,走不下去则回溯到前一节点选择另一条路径走,直到找到解为止. BFS简介 广度优先搜索,从起点开始先搜索其相邻的节点,由此向外不断扩散,直到找到解为止. 举例解释 从1开始去寻找5 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1 2.5     5.3 5出来则找到 遍历图中所有点 DFS: 原则:优先选择左手边 过程:1-2-3-4-6-4-5 BFS: 队列情况:1

广度优先搜索BFS

广度优先搜索可以形成一个广度优先搜索树 算法时间为O(V+E),两重循环 输入:图g,起点start(int) 需要的数据结构:队列Q.color数组(存放每个顶点的颜色) 算法过程: 1. 预处理:1)color数组的每个值都赋为white(表示没被访问过):2)队列Q为空队列 2. 处理起点: 1)color[start]=gray,gray表示顶点已被访问,但其子节点未被处理(指的是入队列):2)Q.enQueue(start) 3. 循环以下操作,直到Q为空 1)int u=Q.deQu

leetCode 79.Word Search (词搜索) 解题思路和方法

The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once. For example, Given board = [ ["ABCE"]

PAT甲级——1091 Acute Stroke (广度优先搜索BFS)

本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/94207638 1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions

广度优先搜索bfs C++实现

#include<iostream>  #include<vector>  #include<map>  #include<queue>  #include<set>  using namespace std;    vector<int> bfs(map<int, vector<int> > link, int top)  {      queue<int> qe;  //队列用来记录节点的遍历顺

leetCode 35.Search Insert Position (搜索插入位置) 解题思路和方法

Search Insert Position Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. You may assume no duplicates in the array. Here are few examples. [1,3,5