【算法】BFS

编程入门 行业动态 更新时间:2024-10-26 07:34:06

【<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法】BFS"/>

【算法】BFS

BFS广度优先搜索

1. 概念理解

广度优先搜索(BFS)是指,以一个起点(原点、结点、根)为基本点,向其所要搜索的方向扩散,并最终到达目标点的搜索方法。

2. 应用方向

有迷宫问题、层序遍历等应用。

3. 迷宫问题

以迷宫问题为例。

当想要从左上角访问到右下角的时候,需要以左上角的起点作为基准点,然后以"下,左,上,右"的方式进行扩散,当到达右下角的时候,停止扩散,输出路径(最少的步数).

3.1 步骤

  1. 将起点入队,并将其作为基准点进行搜索

  2. 依次遍历基准点的周围点,看是否能通行

    2.1. 如果能够通行,那么就将这个点入队

    2.2. 如果不能通行,跳过,判断下一个点

  3. 能通行,入队(如果需要就保存路径至相应的坐标数组)

3.2 代码

#include <iostream>
#include <queue>using namespace std;// 定义二维坐标
typedef pair<int, int> PII;void bfs(int *arr[], const int& row, const int& col) {queue<PII> q;// 1. 将起点入队q.push({ 0,0 });arr[0][0] = 2;// 设置为访问过// 方向数组int dx[] = { 1,0,-1,0,1 };int dy[] = { 0,-1,0,1,1 };// 下,左,上,右,右下// 坐标数组PII pre[100][100];// 2. 看起点周围是否有可行的点while (!q.empty()) {PII top = q.front();q.pop();for (int i = 0; i < 5; i++) {int xx = dx[i] + top.first;int yy = dy[i] + top.second;// 越界if (xx < 0 || yy < 0 || xx >= row || yy >= col) continue;// 不是路if (arr[xx][yy] != 0) continue;q.push({ xx,yy });arr[xx][yy] = 2;pre[xx][yy] = top;// 存上一个位置}}if (q.empty()) {// 打印路径		cout << "(" << row << "," << col << ")" << endl;int i = row - 1;int j = col - 1;while (i || j) {PII tmp = pre[i][j];cout << "(" << tmp.first+1 << "," << tmp.second+1 << ")" << endl;i = tmp.first;j = tmp.second;}}else {cout << "没有通路" << endl;}
}int main() {// 构建迷宫int m, n;cin >> m >> n;int** arr = new int* [m];for (int i = 0; i < m; i++) {arr[i] = new int[n];}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {cin >> arr[i][j];}}// 从0,0开始到m-1,n-1结束bfs(arr, m, n);// 释放内存for (int i = 0; i < m; i++) {delete[] arr[i];}delete[] arr;return 0;
}

更多推荐

【算法】BFS

本文发布于:2023-12-06 08:22:28,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1666999.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法   BFS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!