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

yizhihongxing

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日

相关文章

  • 详解go语言中sort如何排序

    下面是关于”go语言中sort如何排序”的详细讲解。 sort 包简介 sort 包是 Go 语言标准库中的一个包,主要提供排序的功能,使用方便,可以满足我们日常开发中各种排序需求。sort 包中提供的排序方法有: sort.Slice sort.SliceStable sort.Sort sort.Stable sort.Slice sort.Slice …

    算法与数据结构 2023年5月19日
    00
  • Python 数据结构之十大经典排序算法一文通关

    Python 数据结构之十大经典排序算法一文通关 一、前置知识 在学习本文之前,需要具备以下基础知识: Python 基础语法 算法与数据结构基础 二、十大经典排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 本文将一一讲解这十种排序算法。 三、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历过要排…

    算法与数据结构 2023年5月19日
    00
  • javascript笛卡尔积算法实现方法

    JavaScript笛卡尔积算法实现方法 什么是笛卡尔积 笛卡尔积是指给定多个集合,每个集合中分别选取一个元素组成的所有可能组合的集合。例如,有两个集合 X={1,2} 和 Y={3,4},那么它们的笛卡尔积为 {(1,3), (1,4), (2,3), (2,4)}。 实现笛卡尔积算法 JavaScript实现笛卡尔积算法的过程可以分为以下三步: 遍历所有…

    算法与数据结构 2023年5月19日
    00
  • C#实现希尔排序

    C#实现希尔排序攻略 简介 希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序(Diminishing Increment Sorting)。希尔排序首先将要排序的序列分成若干个子序列,分别进行插入排序,待子序列基本有序时,再对全体记录进行一次直接插入排序。其算法主要思想是将原序列按一定间隔分为若干子序列,对每个子序列分别进行插入排…

    算法与数据结构 2023年5月19日
    00
  • 详解JavaScript如何实现四种常用排序

    详解JavaScript如何实现四种常用排序 排序是计算机科学中的重要概念,其主要目的是将一组元素按照一定规则进行排序,便于使用。常见的排序算法有四种:冒泡排序、插入排序、选择排序和快速排序。本文将详细讲解如何使用JavaScript实现这四种常用排序。 冒泡排序 冒泡排序是最简单的排序算法之一,其基本思想是将要排序的数据按从小到大的顺序排列。具体实现过程如…

    算法与数据结构 2023年5月19日
    00
  • PHP四种基本排序算法示例

    关于“PHP四种基本排序算法示例”的完整攻略,我会从以下几个方面进行详细讲解: 排序算法的概念及分类 四种基本排序算法的原理及实现方式 示例说明:冒泡排序和快速排序 排序算法的概念及分类 排序算法是计算机科学中用于将一组数据按照特定顺序进行排列的算法,常用于数据的存储和查找。排序算法可分为内部排序和外部排序,内部排序就是将数据全部放入内存中进行排序,而外部排…

    算法与数据结构 2023年5月19日
    00
  • Java编程实现汉字按字母顺序排序的方法示例

    下面是关于”Java编程实现汉字按字母顺序排序的方法示例”的详细攻略,包含以下步骤: 一、理解题意及需求 题目要求实现汉字按字母顺序排序,我们需要用到汉字拼音转换工具包,如pinyin4j。同时,我们已知的数据是一个汉字数组,需要对这些汉字进行排序并输出结果。因此,我们需要进行以下步骤: 导入pinyin4j包 对汉字进行拼音转换 对转换结果进行排序 输出结…

    算法与数据结构 2023年5月19日
    00
  • C语言 扩展欧几里得算法代码

    下面我来为你详细讲解一下“C语言 扩展欧几里得算法代码”的完整攻略。 什么是扩展欧几里得算法? 扩展欧几里得算法是求解两个整数 a、b 的最大公约数(Greatest Common Divisor,简称 GCD)的一种算法。该算法可以不仅计算出最大公约数,还可以得到一组关于 a、b 的贝祖等式的整数解和一些运算过程。 算法流程 扩展欧几里得算法的流程如下: …

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