c++深度搜索详解

2023-11-18

1. 什么是深度搜索

从计算机科学专业上讲,深度优先搜索算法是最常用图的搜索算法之一,这一算法也是很多重要的图的算法的原型。

深度优先搜索其英文全称是Depth First Search,简称DFS。

深度搜索的特点是先看“一个方向”。例如:骑士在方格地图上搜索迷雾中隐藏的熊猫

2. 棋盘上宽度搜索(DFS)的代码实现

上面的演示中,观察到的是骑兵一但看见一个可以到达的位置,就去进去搜索。又点“类似”一个人走迷宫,一种策略是总是先顺左边墙走,直到走不下去再推到回一个路口,搜索下一个可以走的方向。

因此算法框架如下:

(1) 把初始状态放入栈中,设为当前状态;

(2) 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;

(3) 判断当前状态是否和前面的重复,如果重复则回到上一个状态(出栈),产生它的另一状态;

(4) 判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法。

(5) 如果栈为空,说明无解。

一般来说,深度搜索中有下面基本的要点:

l 确定搜索的规则:“从一个节点怎样看附近的节点”。比如前面的例子中,骑兵从一个格子,依次看上、下、左、右四个格子。如果改变了搜索次序,比如上、左、下、右,搜索的路线就完全不一样。

l 搜索到的“节点”一般进入遵守LIFO的栈,继续深度搜索。

l 被搜索过的节点要标记一下,下次再“看到”时,就不要重复处理进入栈。(注:这样也防止了在一个地方“绕圈”。

l 当一个点可能的“方向”都搜索过了,会退会到“前面的状态”---如果前面状态修改了,要“恢复”。

l 搜索的结束条件---搜索不下去了,“边界条件”。

找出所有可能的线路:

深宽度搜索DFS尝试所有可能的“前进”方式,到达目标时,栈里就保存了一条完整的“线路”,很适合查找所有可能的方案。

比如:下图中马从起点向右到目标的所有线路。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++深度搜索详解 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 亚马逊云科技使用心得:当初我曾错过的那些宝贵经验

    在今天的文章中 我整理出了大量当初曾经错过 而至今仍将我追悔莫及的Amazon Web Services 简称AWS 使用心得 在几年来的实践当中 我通过在AWS之上新手构建及部署各类应用程序而积累到了这些经验 虽然内容有些杂乱 但相信仍然
  • windows10下安装kali子系统

    写在前面 为什么我会想到在窗下装一个卡利 作为一个小白 平时做CTF题的时候 有时会用到python2 7环境 比如一些脚本需要 还有窗户下用的SqlMap的话 好像只支持在python2 7 之前被这个坑了好久 想用它的时候突然发现我的S
  • 个人三年规划建议

    一 前言 最近在 编程导航 有位鱼友的关于职业规划的提问 对于刚进入职场的新人来说 是很常见的问题 下面我分享出来 也希望能帮助到刚进入职场的同学们 在面对未来规划的时候 也有些参考 我的建议不一定适合每一位同学 但有些共性的东西是通的 我
  • innerHTML与XSS攻击

    HTML5为所有元素提供了一个innerHTML属性 既能获取对象的内容又能向对象插入内容 属性值 HTML标签 文本 浏览器会将属性值解析为相应的DOM树 HTML解析器在浏览器中是底层代码比JavaScript方法快很多 同时意味着替换
  • C++新特性03_迭代器iterator及类型推导auto(迭代器:用于容器中数据遍历;动态数组(vector)和链表(list)遍历;堆上下限标志位;类型推导auto:编译时自动推导数据类型)

    迭代器iterator及类型推导auto 1 迭代器 用于容器中数据的遍历操作 1 1 普通数组与动态数组定义及遍历方式 1 1 1 数组 普通的数组 一旦申请 不能再扩增 1 1 2 动态数组 vector 不用指定其大小 会根据数组当前
  • mybatis级联查询

    用户表 CREATE TABLE sys user userid varchar 50 NOT NULL roleid int 11 NOT NULL username varchar 50 DEFAULT NULL COMMENT 用户名
  • go语言学习 1 -- 类型

    Go语言接受了函数式编程的一些想法 支持匿名函数与闭包 接受了以Erlang语言为代表的面向消息编程思想 支持goroutine和通道 并推荐使用消息而不是共享内存来进行并发编程 总体来说 Go语言是一个非常现代化的语言 精小但非常强大 学
  • 公司的电脑为什么卡——因为缺少工程师文化

    点击一键订阅 云荐大咖 专栏 获取官方推荐精品内容 学技术不迷路 最近在给一些公司做技术培训时 发现不少公司还面临这些老问题 腰疼的椅子 卡顿的电脑 小尺寸显示器 24 英寸 不能查资料的网络 导致研发效率低下 员工满意度低 离职率高 公司
  • 推荐算法实战项目:用户协同过滤(UserCF)原理以及案例实战(附完整 Python 代码)

    协同过滤 collaborative filtering 是一种在推荐系统中广泛使用的技术 该技术通过分析用户或者事物之间的相似性 来预测用户可能感兴趣的内容并将此内容推荐给用户 这里的相似性可以是人口特征的相似性 也可以是历史浏览内容的相
  • Centos中Docker,docker-compose,jdk8安装

    Centos中Docker docker compose jdk8安装 Date 2018 08 25 使用Docker仓库安装Docker 1 安装所需软件 sudo yum install y yum utils device mapp
  • 5 分钟快速掌握 OKR 管理法 - OKR 实施篇

    上文 5 分钟快速掌握 OKR 管理法 OKR 理论篇 我们讲到 OKR 的价值和意义 这次重点介绍 OKR 如何实施落地 真正为企业发展发挥作用 怎么制定目标 一个合理的目标需要符合三个原则 第一 与战略目标一致 对公司长期发展有价值 第
  • 力扣(LeetCode)2488. 统计中位数为 K 的子数组(C++)

    哈希表 找不到 O n O n O n 思路 试一下等价代换 数组所有数字大小不同 说明数组中最多有一个 k 数组的 k 要包含在 子数组 里 为了便于思考 分析奇数长度的子数组 在子数组里 大于 k 的数 和小于 k 的数 二者数量相等时
  • 深度学习用什么显卡?3060显卡适合深度学习吗?

    都知道深度学习很吃显卡 显存越大 可以缓存的内容就越多 对于非常吃显存的图像类深度学习程序来说 显存太小的显卡批处理就不能调太大 否则会程序会报错 深度学习用什么显卡 3060显卡适合深度学习吗 本文来解答一下这个问题 3060显卡适合深度
  • Spring动态代理用JDK还是用CGLIB?

    切面编程是Spring中非常重要的一个模块 切面编程的实现原理是动态代理 那么动态代理又有两种实现方式 一种方法是直接实现JDK中的InvocationHandler接口 另一种方法是继承CGLIB 那么问题来了 这两种方法有啥区别呢 分别
  • 数据结构——图的DFS(深度优先遍历)- C语言代码实现

    图的深度优先遍历的基本思想 从图中某顶点v出发 1 访问顶点v 2 依次从v的未被访问的邻接点出发 对图进行深度优先遍历 直至图中和v有路径相通的顶点都被访问 3 若此时图中尚有顶点未被访问 则从一个未被访问的顶点出发 重新进行深度优先遍历
  • Javescribt Library Javescript 库 总结

    Yahoo User Interface Library YUI Library YUI is a free open source JavaScript and CSS library for building richly intera
  • JavaScript 刷新或关闭网页时弹窗确认

    beforeunload事件在当页面关闭或刷新时调用 事件触发的时候弹出一个有确定和取消的对话框 确定则离开页面 取消则继续待在本页 有两种方法绑定事件 三种方法实现弹窗 通过 window addEventListener 对 retur
  • 轻量级前端MVVM框架avalon:整体架构

    单看这个图呢 还木有说明 感觉有点蛋疼 作者的将夜 www jiangyea com抽象度太高了 还好在前面已经大概分析过了执行流程 如图 左边是View视图 我们就理解html结构 换句话就是说用户能看到的界面 渲染页面 绑定事件 切换类
  • 【UE4 像素流 WEBUI插件】部署像素流

    目录 一 单实例本地像素流送 步骤 1 勾选插件 2 打包工程并启动信令服务器 3 创建快捷方式并启动游戏 二 单实例局域网像素流送 步骤 1 编辑cirrus js 2 编辑快捷方式属性 3 启动 三 集成WEBUI插件 一 单实例本地像
  • c++深度搜索详解

    1 什么是深度搜索 从计算机科学专业上讲 深度优先搜索算法是最常用图的搜索算法之一 这一算法也是很多重要的图的算法的原型 深度优先搜索其英文全称是Depth First Search 简称DFS 深度搜索的特点是先看 一个方向 例如 骑士在