广度优先搜索(Breadth First Search, BFS)
广度优先搜索(Breadth First Search, BFS)
BFS算法实现的一般思路为:
// BFS
void BFS(int s){
queue<int> q; // 定义一个队列
q.push(s); // 队首元素入队 while (!q.empty()){
// 取出队首元素top
// 访问队首元素
// 将队首元素出队
// 将top的下一层结点中未曾入队的结点全部入队,并设置为已入队
}
}
常见题型一:

代码实现:
#include <stdio.h>
#include <queue>
using namespace std; const int maxn = ; // 位置结构体
struct node{
int x, y; // 位置(x, y)
}Node; int n, m; // 矩阵大小为 n * m
int matrix[maxn][maxn]; // 01 矩阵
bool inq[maxn][maxn] = { false }; // 记录位置 (x, y) 是否已入过队
int X[] = { , , , - }; // 增量数组
int Y[] = { , -, , }; // 判断坐标(x, y)是否需要访问
bool judge(int x, int y){
// 越界访问false
if (x >= m || x < || y >= n || y < ){
return false;
}
// 当前位置为0或者已经入过队也返回false
if (matrix[x][y] == || inq[x][y] == true){
return false;
}
// 否则返回 true
return true;
} // BFS函数访问位置(x, y)所在的块,将该块的所有'1'的inq都设置为 true
void BFS(int x, int y){
// 定义一个队列
queue<node> Q;
// 队首元素入队
Node.x = x, Node.y = y;
Q.push(Node); // 队列不为空则一直循环
while (!Q.empty()){
// 取出队首元素
node top = Q.front();
// 访问队首元素
// 弹出队首元素
Q.pop();
// 将这个元素所相连的坐标设置为已入队
for (int i = ; i < ; i++){
int newX = top.x + X[i];
int newY = top.y + Y[i];
if (judge(newX, newY)){
Node.x = newX, Node.y = newY;
// 将所有相连坐标入队
Q.push(Node);
inq[newX][newY] = true; // 设置位置[newX, newY]为已入过队
}
}
}
} int main()
{
// 读取输入
scanf("%d %d", &m, &n);
for (int i = ; i < m; i++){
for (int j = ; j < n; j++){
scanf("%d", &matrix[i][j]); // 读入 01 矩阵
}
int ans = ; // 存放块数
// 遍历矩阵
for (int x = ; x < m; x++){
for (int y = ; j < n; y++){
// 入过位置为1 且没有入过队则计数器加一
if (matrix[x][y] == && inq[x][y] == false){
ans++;
BFS(x, y);
}
}
}
} printf("%d\n", ans); return ;
}
常见题型二:

代码实现:
#include <stdio.h>
#include <queue>
using namespace std; const int maxn = ;
struct node{
int x, y;
int step; // step 为从起点到终点位置最少的步数(即层数)
}S, T, temp; int m, n; // n 为行, m位列
char maze[maxn][maxn]; // 迷宫信息
bool inq[maxn][maxn] = { false };
int X[] = { , , , - };
int Y[] = { , -, , }; // 检测位置(x, y)是否有效
bool test(int x, int y){
if (x >= m || x < || y >= n || y < )
return false;
if (maze[x][y] == '*' || inq[x][y] == true)
return false;
return true;
} int BFS(){
queue<node> q;
q.push(S); while (!q.empty()){
node top = q.front();
if (top.x == T.x && top.y == T.y)
return top.step;
q.pop();
for (int i = ; i < ; i++){
int newX = top.x + X[i];
int newY = top.y + Y[i];
if (test(newX, newY)){
// 创建一个新结点
node temp;
temp.x = newX, temp.y = newY;
temp.step = top.step + ;
q.push(temp);
inq[newX][newY] = true;
}
}
}
return -;
} int main()
{
scanf("%d %d", &m, &n);
for (int i = ; i < m; i++){
for (int j = ; j < n; j++){
maze[i][j] = getchar();
}
maze[i][n] = '\0';
}
scanf("%d %d %d %d", &S.x, &S.y, &T.x, &T.y);
S.step = ;
printf("%d\n", BFS()); return ;
}
广度优先搜索(Breadth First Search, BFS)的更多相关文章
- 数据结构之 图论---基于邻接矩阵的广度优先搜索遍历(输出bfs遍历序列)
数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...
- javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)
最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- [SOJ] 图的广度优先搜索
Time Limit: 1sec Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...
- (转)广度优先搜索BFS和深度优先搜索DFS
1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
- 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 【js数据结构】图的深度优先搜索与广度优先搜索
图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...
- [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索
一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...
随机推荐
- 我眼中的ASP.NET.MVC
MVC MVC全名 : Model View Controller ( Model-模型 View-视图 Controller-控制器)是一种经典的,经久不衰的,屹立不倒的软件设计框架.实现了业务逻 ...
- .net core 3.0 swagger
1.安装swagger包 2.startup里configservers Configure 3.可能出现的错误 提示error xxxxnot found 由于我创建的webapi是restful ...
- C# WPF简况(2/3)
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF简况(2/3) 阅读导航 本文背景 代码实现 本文参考 1.本文背景 承接上文(C ...
- Java学习随笔---常用API(二)
Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ...
- Python 3.8 已发布,现在是切换至新版本的好时机吗?
Python 3.8 已于前两周正式发布,不过目前大多数开发者主要使用的仍是 Python 3.7.x 或更旧的版本. ! 事实上,立刻切换到使用 Python 3.8 可能会引发一些问题.想知道何时 ...
- Python 函数 初学者笔记
定义函数 def greet_user(username):#定义一个名为greet_user的函数,username时个形参 print("Hello!" + usernam ...
- ESLint 使用指南
ESLint 官方文档 About 页面分 About 和 Philosophy 两个部分对 ESLint 做了介绍,简洁明了,值得一读. 借助 ESLint,可将 静态代码分析 和 问题代码协助修复 ...
- JavaDay10(下)
生产者消费者问题 问题描述 有两个进程:一组生产者进程和一组消费者进程共享一个初始为空.固定大小为n的缓存(缓冲区).生产者的工作是制造一段数据,只有缓冲区没满时,生产者才能把消息放入到缓冲区,否则必 ...
- BugkuCTF flag.php(反序列化)
进去后是个登录页面,但是login根本不会跳转,看源码也没提示,但是这道题给了一个提示:hint,那么盲猜应该是一个get参数,因为post不能跳转,那么get总有内容吧,跟上hint参数,随便赋一个 ...
- ASP.NET常用内置对象(三)Server
Server对象是HttpServerUtility的一个实例,也是上下文对象HttpContext的一个属性,提供用于处理Web请求的Helper方法. Server.MapPath("& ...