热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

算法笔记广度优先搜索

算法笔记-广度优先搜索-深度优先搜索的本质是递归,广度优先搜索不需要递归深度优先搜索不要用栈实现,广度优先搜索要用队列实现scanf()按s格式符不能输入带空格的字符串gets()

深度优先搜索的本质是递归,广度优先搜索不需要递归

深度优先搜索不要用栈实现,广度优先搜索要用队列实现

scanf()按s格式符不能输入带空格的字符串

gets()输入带空格的字符串

scanf()以回车符作为字符串的终止符,同时不读走回车符,回车符仍然留在输入缓冲区中

gets()以回车符作为字符串的终止符,同时将回车符从输入缓冲区读走,但不作为字符串的一部分

《C语言程序设计(苏小红)》P258

当需要读入字符时,可以套用以下代码:

scanf("%d%d",&n,&m);
for(int i=0; i

getchar()的作用是从系统隐含指定的输入设备(即终端键盘)输入一个字符,按回车键表示输入结束,也接受空格

下面举一个迷宫的例子,输入一个迷宫,输入起点终点,通过广度优先搜索得到最短路径:

#include 
#include 
#include 
#include 
using namespace std;

const int maxn = 1000;
char maze[maxn][maxn];
bool inq[maxn][maxn];
int n;
int m;
struct node
{
    int x;
    int y;
    int step;
};

node S;
node T;
node mid;
int ans=0;

int xChange[4] = {0,0,-1,1};
int yChange[4] = {1,-1,0,0};

queue link;

bool judge(int x,int y)
{
    if(x<0||x>=m||y<0||y>=n)
    {
        return false;
    }
    if(maze[x][y]=='*' || inq[x][y]==true)
    {
        return false;
    }
    return true;
}

int BFS()
{
    link.push(S);
    inq[S.x][S.y] = true;
    while(!link.empty())
    {
        node temp = link.front();
        link.pop();
        int nowStep = temp.step;
        if(temp.x == T.x && temp.y == T.y){
            ans = nowStep;
            return nowStep;
        }
        for(int i=0; i<4; i++)
        {
            int tempX = temp.x+xChange[i];
            int tempY = temp.y+yChange[i];
            if(judge(tempX,tempY)){
                node fresh;
                fresh.x = tempX;
                fresh.y = tempY;
                fresh.step = nowStep+1;
                link.push(fresh);
                inq[tempX][tempY] = true;
            }
        }
    }//队列完全可能为空
    return -1;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0; i

广度优先搜索适合求最短路径,因为只要第一次发现满足条件的路径,该路径一定是最短路径,比如上图的迷宫

queue中,元素入队的push操作只是制造了该元素的一个副本入队,因此在入队后对原元素的修改不会改变队列中的副本,而对队列中副本的修改也不会改变原元素,需要注意由此可能引入的bug

当需要对队列queue中的元素进行修改而不仅仅是访问时,队列中存放的元素最好不要是元素本身,而是它们的编号 (如果是数组的话则是下标

参考书目:《算法笔记》《C语言程序设计》


推荐阅读
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • LeetCode 104. 二叉树的最大深度 - 深度优先与广度优先策略
    本题探讨了如何通过深度优先搜索(DFS)和广度优先搜索(BFS)两种算法策略来求解二叉树的最大深度问题。二叉树的最大深度定义为从根节点到最远叶子节点的最长路径上的节点数目。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细介绍了二叉堆的概念及其在Java中的实现方法。二叉堆是一种特殊的完全二叉树,具有堆性质,常用于实现优先队列。 ... [详细]
  • BeautifulSoup4 是一个功能强大的HTML和XML解析库,它能够帮助开发者轻松地从网页中提取信息。本文将介绍BeautifulSoup4的基本功能、安装方法、与其他解析工具的对比以及简单的使用示例。 ... [详细]
  • 近期在研究Java IO流技术时,遇到了一个关于如何正确读取Doc文档而不出现乱码的问题。本文将详细介绍使用Apache POI库处理Doc和Docx文件的具体方法,包括必要的库引入和示例代码。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 本文详细介绍了 Redis 中的主要数据类型,包括 String、Hash、List、Set、ZSet、Geo 和 HyperLogLog,并提供了每种类型的基本操作命令和应用场景。 ... [详细]
  • 知识图谱与图神经网络在金融科技中的应用探讨
    本文详细介绍了融慧金科AI Lab负责人张凯博士在2020爱分析·中国人工智能高峰论坛上的演讲,探讨了知识图谱与图神经网络模型如何在金融科技领域发挥重要作用。 ... [详细]
  • MySQL InnoDB 存储引擎索引机制详解
    本文深入探讨了MySQL InnoDB存储引擎中的索引技术,包括索引的基本概念、数据结构与算法、B+树的特性及其在数据库中的应用,以及索引优化策略。 ... [详细]
author-avatar
當紅冷萱儿_422
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有