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

C++实现广度优先搜索实例攻略

什么是广度优先搜索?

广度优先搜索(Breadth-First Search,也称之为BFS)是一种基于图的搜索算法,用于访问位于某个特定顶点距离为K的所有顶点。它广泛应用于树和图的数据结构中。

BFS的过程如下:

  1. 从源节点开始遍历;
  2. 访问相邻的节点;
  3. 将相邻节点加入队列;
  4. 标记已访问的节点;
  5. 重复步骤2-4,直到队列为空。

如何用C++实现BFS算法?

以下是用C++实现BFS算法的步骤:

  1. 定义一个节点结构体,并用邻接矩阵存储图;
  2. 定义一个bool类型的visited数组,用于记录节点是否被访问过;
  3. 定义一个queue数据结构,并将起始节点压入队列;
  4. 使用while循环遍历队列,对队首节点进行访问;
  5. 将队首节点相邻的未被访问的节点加入队列,并将其标记为已访问;
  6. 重复步骤4-5,直到队列为空。

示例1:求最短路径

假设有一个无向图(具体定义见代码),其中每条边的距离为1,现在我们要求从节点0到节点5的最短路径。可以使用以下C++代码实现BFS算法:

#include <iostream>
#include <queue>
using namespace std;

const int MAX = 10;
int graph[MAX][MAX]; // 邻接矩阵存储图
bool visited[MAX]; // 是否已经访问过

int BFS(int start, int end)
{
    queue<int> q;
    int steps = 0;
    q.push(start);
    visited[start] = true;
    while (!q.empty())
    {
        int n = q.size();
        steps += 1;
        for (int i = 0; i < n; i++)
        {
            int cur = q.front();
            q.pop();
            for (int j = 0; j < MAX; j++)
            {
                if (graph[cur][j] == 1 && !visited[j])
                {
                    if (j == end)
                    {
                        return steps;
                    }
                    visited[j] = true;
                    q.push(j);
                }
            }
        }
    }
    return -1; // 没有找到从start到end的路径
}

int main()
{
    // 初始化图
    graph[0][1] = graph[0][3] = 1;
    graph[1][0] = graph[1][2] = graph[2][1] = graph[2][4] = graph[3][0] = graph[3][4] = graph[4][2] = graph[4][3] = graph[4][5] = 1;

    int res = BFS(0, 5);
    cout << "The length of the shortest path from 0 to 5 is:" << res << endl;

    return 0;
}

输出结果为:

The length of the shortest path from 0 to 5 is:3

示例2:迷宫求解

假设有一个迷宫(具体定义见代码),其中0表示可以通行的路径,1表示墙不能通行,现在我们要求从起点[0][0]到终点[2][2]的最短路径。可以使用以下C++代码实现BFS算法:

#include <iostream>
#include <queue>
using namespace std;

const int MAX = 3;
int maze[MAX][MAX] = {{0,1,0},{0,0,1},{1,0,0}}; // 迷宫
bool visited[MAX][MAX]; // 是否已经访问过
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; // 四个方向

int BFS(int startx, int starty, int endx, int endy)
{
    queue<pair<int, int>> q;
    int steps = 0;
    q.push(make_pair(startx, starty));
    visited[startx][starty] = true;
    while (!q.empty())
    {
        int n = q.size();
        steps += 1;
        for (int i = 0; i < n; i++)
        {
            pair<int, int> cur = q.front();
            q.pop();
            for (int j = 0; j < 4; j++)
            {
                int newx = cur.first + dir[j][0];
                int newy = cur.second + dir[j][1];
                if (newx < 0 || newx >= MAX || newy < 0 || newy >= MAX)
                {
                    continue;
                }
                if (maze[newx][newy] == 0 && !visited[newx][newy])
                {
                    if (newx == endx && newy == endy)
                    {
                        return steps;
                    }
                    visited[newx][newy] = true;
                    q.push(make_pair(newx, newy));
                }
            }
        }
    }
    return -1; // 没有找到从(startx, starty)到(endx, endy)的路径
}

int main()
{
    int res = BFS(0, 0, 2, 2);
    cout << "The length of the shortest path from (0,0) to (2,2) is:" << res << endl;

    return 0;
}

输出结果为:

The length of the shortest path from (0,0) to (2,2) is:2

总结

通过以上示例,我们可以发现,BFS算法可以解决许多基于图结构的问题,如求最短路径、迷宫求解等。在使用C++实现BFS算法时,我们需要定义节点结构体、用邻接矩阵存储图、定义visited数组等,并使用queue数据结构以及while循环来实现算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现广度优先搜索实例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • c# 冒泡排序算法(Bubble Sort) 附实例代码

    冒泡排序算法(Bubble Sort) 冒泡排序算法是比较简单的排序算法之一,它通过多次比较和交换相邻两个元素的位置,将整个序列逐步变得有序,因此也被称为“泡沫排序”。 算法步骤: 从序列的第一个元素开始,与第二个元素进行比较,如果第一个元素大于第二个元素,则交换这两个元素; 接着再与第三个元素进行比较,如果第二个元素大于第三个元素,则交换这两个元素; 以此…

    算法与数据结构 2023年5月19日
    00
  • javascript冒泡排序小结

    JavaScript冒泡排序小结 什么是冒泡排序 冒泡排序是一种经典排序算法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果顺序不对则交换它们,直到没有需要交换的元素为止。 冒泡排序的步骤 冒泡排序的主要步骤如下: 比较相邻的元素。如果第一个比第二个大,就交换它们; 对每一对相邻的元素做同样的工作,从开始的第一对到结尾的最后一对,这样在最后的元素应…

    算法与数据结构 2023年5月19日
    00
  • C++实现堆排序示例

    下面就详细讲解一下“C++实现堆排序示例”的完整攻略。 什么是堆排序 堆排序是一种树形选择排序方法,它是通过将待排序的序列构建成一个堆,在堆中,全局最大或最小的元素总是位于根节点,根节点最大或最小的元素会被输出到一个新的序列中,再将剩余的元素重新构建成堆进行下一轮循环,直到所有元素均被输出为止。 实现步骤 堆排序主要有两个步骤:构建堆和调整堆。 构建堆 将待…

    算法与数据结构 2023年5月19日
    00
  • c#实现最简洁的快速排序(你绝对可以看懂)

    下面我将详细讲解“c#实现最简洁的快速排序(你绝对可以看懂)”的完整攻略。 1、什么是快速排序? 快速排序是一种常用的排序算法,其思想是将一个数组划分为两个子数组,然后分别对这两个子数组进行排序。通过不断地递归调用这个过程,最终得到有序的数组。 2、快速排序的步骤 下面是快速排序的步骤: 选择一个基准值(pivot),一般选择数组中的第一个元素。 定义两个指…

    算法与数据结构 2023年5月19日
    00
  • java图搜索算法之图的对象化描述示例详解

    Java图搜索算法之图的对象化描述示例详解 什么是图? 图是一种非线性数据结构,由节点和边组成,节点表示图中对象,边表示节点间相互关系。图分为有向图和无向图,有向边和无向边。 图的对象化描述 Java中可以使用对象化的方式来描述一个图,主要有两个类: Vertex(节点类) 节点类表示图中的节点,主要有两个属性: label:节点标签,用于区分不同节点。 w…

    算法与数据结构 2023年5月19日
    00
  • C#算法之全排列递归算法实例讲解

    C#算法之全排列递归算法实例讲解 什么是全排列? 全排列是指将一个给定的集合中的元素进行排列,使得每个元素只出现一次,且每个元素在排列中的位置是不确定的,从而得到的所有不同排列。比如给定集合{1, 2, 3}的全排列包括{1, 2, 3}、{1, 3, 2}、{2, 1, 3}、{2, 3, 1}、{3, 1, 2}和{3, 2, 1}。 递归算法实现全排列…

    算法与数据结构 2023年5月19日
    00
  • C语言简明讲解快速排序的应用

    C语言简明讲解快速排序的应用 快速排序的概述 快速排序是一种基于比较的排序算法,最初由Tony Hoare于1959年发明,因其在实践中的高效性而受到广泛的应用。快速排序的基本思想是通过不断地分割(partition)和交换(swap)来实现排序,具体来说,就是先选取一个pivot数,然后将序列中小于pivot的数放在pivot左边,大于pivot的数放在p…

    算法与数据结构 2023年5月19日
    00
  • TypeScript十大排序算法插入排序实现示例详解

    针对“TypeScript十大排序算法插入排序实现示例详解”的完整攻略,我有如下的描述和示例: 1. 算法简介 插入排序(Insertion Sort)是一种简单直观的排序算法。它的基本思想是将目标数组分为已排序和未排序区间,每次从未排序区间中选取一个元素并插入到已排序区间中正确的位置。 插入排序是一种相对基础的排序算法,不仅实现起来比较简单,而且时间复杂度…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部