宽度优先搜索

宽度优先搜索(BFS)是一种层次遍历的搜索算法,通常借助队列实现。从给定顶点开始,逐层访问所有可达顶点,避免回溯。本文通过迷宫问题的实例,分别分析了如何使用BFS解决问题,并总结了BFS与深度优先搜索(DFS)的特点。
摘要由CSDN通过智能技术生成

一、简介

  • 宽度优先搜索BFS,它的基本思想是仿树的层次遍历,不过通常都会借助队列实现。
    1、初始状态是图中所有顶点未被访问,从图中某个顶点V1出发,访问这个顶点;
    2、然后依次访问V1的所有未被访问过的邻接点V2,V3,按照这些顶点被访问的先后顺序一次访问它们的邻接点,直到图中所有和V1有路径相通的顶点全部都被访问过一遍;
    3、若还有顶点未被访问,则从中选一个作为起始点,重复上述过程,直到图中所有顶点都被访问过为止。
    4、遍历顺序:V1->V2->V3->V4->V5->V6->V7->V8
    在这里插入图片描述
  • BFS是一个分层的搜索过程,每向前走一步可能访问一批顶点,不像DFS那样有回溯的可能;
  • 所以BFS不是一个递归的过程,它的算法也不是递归的。

二、实例

  • 在这里我们依然用上篇文章的迷宫问题来作为例子,不同的是这次用BFS实现;
  • 问题一分析
    从起始点开始,将起始点存入队列中,走过起始点后将它出队,将下一步可能出现的情况入队,然后走过的顶点出队,直到队列为空,若此时还没到达终点,则不可能走出迷宫;
  • 代码实现
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int map[12][12], mark[12][12], dir[4][2] = {
    {
    1, 0 }, {
    0, 1 }, {
    -1, 0 }, {
    0, -1 } };// 下右上左
bool BFS(int x, int y, int n, int m)
{
   
    mark[x][y] = 1; // 标记已经走过
    queue<int> q_x, q_y;
    q_x.push(x);
    q_y.push(y);
    while (q_x.size()) // 队列非空
    {
   
        int x = q_x.front();
        int y = q_y.front
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值