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#实现希尔排序

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

    算法与数据结构 2023年5月19日
    00
  • 2019年京东前端工程师面试题(附答案)

    本次将会以京东前端工程师面试题为例,详细讲解如何准备和应对前端岗面试。 第一步:了解面试整体流程和考察的技能点 在准备面试前,需要先了解面试的整体流程和所考察的技能点,从而根据需要和缺点来进行有针对性的准备。 面试的整体流程一般包括: 自我介绍和岗位广告 聊聊项目和技术栈 问题解答和技术评测 算法/编码能力测试 HR面试 而在前端工程师的岗位面试中,考察的技…

    算法与数据结构 2023年5月19日
    00
  • JavaScript数组基于交换的排序示例【冒泡排序】

    下面是JavaScript数组基于交换的排序示例【冒泡排序】的完整攻略: 冒泡排序 冒泡排序是最基本的排序算法之一,它的原理是通过比较相邻的元素,将较大的元素交换到右侧,较小的元素交换到左侧,最终将整个数组按照升序排列。 下面是一份基于交换的冒泡排序代码,我们通过代码中加入注释来讲解冒泡排序的实现过程: function bubbleSort(arr) { …

    算法与数据结构 2023年5月19日
    00
  • 利用JavaScript在网页实现八数码启发式A*算法动画效果

    下面是利用JavaScript在网页实现八数码启发式A*算法动画效果的完整攻略: 简介 八数码问题是指在一个33的方格上,放置了1~8这八个数字,其中有一个空格可以移动,初态和目标态之间的变换最少需要几步。而启发式A算法是一种针对图形和网络中的路径规划问题的搜索算法。 利用JavaScript实现八数码启发式A*算法动画效果,可以帮助用户在屏幕上直观地看到计…

    算法与数据结构 2023年5月19日
    00
  • C语言完整实现12种排序算法(小结)

    C语言完整实现12种排序算法(小结) 本文主要介绍了C语言实现12种排序算法的详细过程以及相关示例。 排序算法的分类 排序算法可分为内部排序和外部排序。内部排序是指将待排序的数据全部加载到内存中进行排序,而外部排序是指在数据量过大时需要将数据分块,对每一块数据进行排序,最后将各个块合并起来,得到有序的结果。 在内部排序中,常用的排序算法大致可分为以下几类: …

    算法与数据结构 2023年5月19日
    00
  • js实现常用排序算法

    JS实现常用排序算法 排序算法是计算机领域中的重要算法之一,其作用是将一组无序的数据按照一定的规则进行排列,便于数据的查找和统计。在前端开发领域中,JS是常用的编程语言,下面一起来详细讲解如何用JS实现常用排序算法。 冒泡排序 冒泡排序是一种简单的排序算法,其具体思路是对需要排序的元素从头开始进行比较,如果前一个元素比后一个元素大,就交换这两个元素的位置,一…

    算法与数据结构 2023年5月19日
    00
  • PHP快速排序quicksort实例详解

    PHP快速排序quicksort实例详解 本文将详细介绍如何使用PHP实现快速排序算法,并提供两个示例进行说明。 基本思路 快速排序是一种比较常见的排序算法,其基本思路是通过递归将待排序数组分割成更小的子数组,并把比基准值小的元素一次放到基准值左边,比基准值大的元素一次放到基准值右边,然后对左右两边分别递归执行上述操作,直到分割成的子数组长度为1,此时由于子…

    算法与数据结构 2023年5月19日
    00
  • c++实现排序算法之希尔排序方式

    C++实现排序算法之希尔排序 前置知识 希尔排序是一种基于插入排序的排序算法 插入排序是一种简单直观的排序算法 算法思路 希尔排序是一种分组插入排序的算法。它的基本思想是:先将待排序序列按照一定规则分成若干子序列,对各个子序列进行插入排序,然后逐步缩小子序列的长度,最终使整个序列成为一个有序序列。 例如,对于一个序列 5 2 8 9 1 3 7 6 4,我们…

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