深度优先算法

C++ 算法篇 深度优先搜索(DFS) 图的遍历 图的遍历为从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次的过程。 对于图的遍历,不想树那么简单,需要在遍历的过程中把访问过的顶点打上标记,以避免访问多次。具体办法是设置一个访问数组visited[n],n是图中顶点的个数,初始值为0,访问后设置为1。 对于图的遍历来说,通常有两种遍历方案:深度优先遍历和广度优先遍历。 深度优先遍历 深度优先遍历(Depth_Fi... 阅读详情

深度优先算法

深度优先百度百科

深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

有点不太好理解

二维数组数据结构就如图所示 整个节点构成的图 是一个二维数组,当进行深度优先的时候先以黑色箭头为指向的下标节点开始搜索,先搜索 arr[0][index] 开始找到存在通路的第一个节点且该节点没有被访问过,找到后就将黑色箭头移到对应的index 即 black_index = index, 然后继续搜索,找到第一个通路的节点,当节点被访问过就继续查找arr[black_index][index]的下一个节点是否是通路,如果找到了继续移动黑色箭头。

简单的说 直接搜索对应的black_index 对应的一维数组中依次查找能够联通的节点,找到了就从红色箭头代表的index 赋值给 black_index 然后再再这个black_index中查找,并标记已经查找过的节点,如果第一次还没搜索完成,那么就将black_index 加 1 后再查找。

namespace DataStructure {

    export class MapGrap {

        private edges: number[][]; // 边对应的数据
        private vertexs: string[]; // 顶点数据
        private numberOfEdges: number; // 总共的边数

        private isVisited: boolean[]; // 顶点是否被访问过

        constructor(vertex: number) {
            this.vertexs = new Array<string>();

            this.isVisited = new Array<boolean>(vertex);
            this.edges = new Array<Array<number>>(vertex);
            for (let i = 0; i < this.edges.length; i++) {
                this.edges[i] = new Array<number>(vertex);
                for (let j = 0; j < this.edges[i].length; j++) {
                    this.edges[i][j] = 0; // 初始化权值都是 0
                }
            }
            this.numberOfEdges = 0;
        }

        /**
         * 深度搜索
         */
        public dfs() :void{
            for (let index = 0; index < this.edges.length; index++) { // for循环查找所有节点
                if(! this.isVisited[index]){

                    this.dfsSearch(this.isVisited, index);
                }
            }
        }

        public dfsSearch(_isVisited: boolean[], row: number): void {

            console.log(this.getVertexName(row) +" -- >");
            let first = this.getFirstNeightbour(row);
            _isVisited[row] = true;
            while(first != -1){
                if(! _isVisited[first]){
                    this.dfsSearch(_isVisited, first);
                }
                first = this.getNextNeightbour(row, first);
            }
        }

        /** 获取下一个顶点,通过startCol来确定起始的位置,减少多余的操作 */
        private getNextNeightbour(row: number, startCol: number) : number{
            for (let index = startCol+1; index < this.edges[row].length; index++) {
                if (this.edges[row][index] > 0) {
                    return index;
                }
            }
            return -1;
        }
        
        /** 查找第一个邻近的顶点 */
        private getFirstNeightbour(row: number): number {
            for (let index = 0; index < this.edges[row].length; index++) {
                if (this.edges[row][index] > 0) {
                    return index;
                }
            }
            return -1;
        }

        public getEdgesWeight(v1: number, v2: number): number {
            return this.edges[v1][v2];
        }

        public printMap(): void {
            console.log("地图打印: -------------------------------");
            console.table(this.edges);
            for (const rows of this.edges) {
            }
        }

        /**
         * 添加顶点
         * @param vertex 顶点字符串
         */
        public addVertex(vertex: string): void {
            this.vertexs.push(vertex);
        }

        /**
         * 插入一条边
         * @param v1 顶点一
         * @param v2 顶点二
         * @param weight 权重 或者  你需要的边长路径之类的
         */
        public insertEdge(v1: number, v2: number, weight: number): void {
            if (!this.edges[v1]) {
                this.edges[v1] = new Array<number>(this.getVertexLen());
            }
            if (!this.edges[v2]) {
                this.edges[v2] = new Array<number>(this.getVertexLen());
            }
            this.edges[v1][v2] = weight;
            this.edges[v2][v1] = weight;
            this.numberOfEdges++;
        }

        public getVertexLen(): number {
            return this.vertexs.length;
        }

        public getVertexName(index: number): string {
            return this.vertexs[index];
        }
    }
}
随机迷宫生成算法——深度优先算法 迷宫是我们小时候经常玩的游戏,如何用代码来快速生成上面这种迷宫呢? 迷宫算法有三大算法:深度优先算法、prim算法和递归分割算法。这里用的是深度优先算法,在此说一下算法思路,希望对各位有所帮助。 首先我的假设是,迷宫只有一条正确的道路。 这个时候请把自己想象成一只地鼠,要在这个区域不停的挖,直到任何一块区域再挖就会挖穿了为止。 我们挖的道路就像树结构,树上有很多的分支,分支也有子... 阅读详情

相关推荐

10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,...

python函数基础教程 2188

深度优先算法(DFS)

根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文介绍深度优先算法: 深度优先算法 1、算法概述 深度优先搜索属于图算法的一种,英文缩写为DFS。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 深度优先搜索是一种在开发爬虫早期使用较多的方法,它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。 它的...

qq_41896683的博客 3万+

深度优先算法和广度优先算法

今天做了daoti

solar一抹阳光的专栏 8441

深度优先算法DFS(Depth First Search)

不撞南墙不回头。

Iamme 1万+

Label Studio 图像分割自动标注接入教程:从模型预测到一键上传 Predictions

这篇文章详细介绍了如何使用Label Studio进行图像分割任务的自动标注流程。主要内容包括: 环境准备:安装Label Studio和模型推理依赖 项目配置:启动Label Studio服务,创建项目并配置BrushLabels标注界面 数据准备:导入待标注图片,获取API访问凭证 模型推理:运行训练好的分割模型生成预测mask 结果上传:将预测结果转换为Label Studio格式并通过API上传为Predictions 文章提供了完整的操作指南,包括: 详细的命令行参数说明 推荐的项目目录结构 标注

. 451

10位PWM能否满足电梯±5mm平层精度?4位扩展法让10位PWM达到14位精度

电梯平层精度直接关系乘坐舒适性与安全性,而PWM分辨率是决定精度的关键因素之一。10位PWM能否满足±5mm的平层精度要求?本文从分辨率与物理量的对应关系出发,结合工程精度需求与实战对比,给出明确的选型结论与解决方案,请参考优快云博客《4位扩展法:基于ATtiny816的高精度PWM软件扩展方法》和《低成本高精度PWM:4位扩展法原理、实现和工程实践》。10位PWM的分辨率为 $2^{10} = 1024$ 级。

m0_73354873的博客 244

深度优先搜索算法(depth-first-search)

本文以迷宫的例子详细介绍了DFS算法的基本思想和实际应用。

xiaoxi_hahaha的博客 2948

基于近场动力学的二维疲劳裂纹扩展模型_近场动力学数值模拟的程序实现(1)——引言...

参考书目W. H. Gerstle. 2015. Introduction to Practical Peridynamic: Computational Solid Mechanics Without Stress and Strain.E.Madenci, A.Barut, M.Dorduncu. Peridynamic Differential Operator for Numerical ...

weixin_39764603的博客 1202

ACWing n-皇后问题

n−n−皇后问题是指将nn个皇后放在n×nn×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数nn,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包含整数nn。 输出格式 每个解决方案占nn行,每行输出一个长度为nn的字符串,用来表示完整的棋盘状态。 其中.表示某一个位置的方格状态为空,Q表示某一个位置的方格上摆着皇后。 每个方案输出完成后,输出一个空行。 注意:行末不能有多余空格。 输出方...

Stillboring的博客 2481

量子密钥分发系统设计与实现(一):系统基本架构讨论

本文主要对量子密钥分发系统中的基础架构和基于系统的量子密钥协商过程进行了初步讨论,为后期系列文章进行铺垫。

量子领域相关话题 3896

ARS408毫米波雷达数据解析避坑指南:从硬件连接到Python处理

本文提供了ARS408毫米波雷达从硬件连接到Python数据处理的完整实战指南。针对串口通信不稳定、数据解析错误等常见问题,详细解析了硬件连接方案选择、串口数据高效读取策略、二进制协议解析的位操作技巧,并给出了坐标转换、目标跟踪及实时可视化的代码实现,帮助开发者快速搭建稳定的雷达数据处理流水线。

weixin_29091105的博客 149

【算法笔记】深度优先算法DFS(保姆级教学,一篇让你搞懂DFS的精髓)

本文章介绍了搜索算法中常用的DFS深度优先算法,它的核心思想是从一个起点开始,沿着一个方向尽可能深地搜索,直到无法继续为止,然后回溯到上一个节点,继续沿着其他方向搜索。DFS可以使用递归或栈(非递归)来实现。

weixin_74297512的博客 6527

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1032

LeetCode琅琊榜第十三层-全排列(DFS深度优先算法)

LeetCode.46全排列 难度:中等 博主空间与往期力扣 题目链接

算法萌新一枚 804

【调优】OpenClaw从零开始高阶调优之skill篇

本文详细解析了OpenClaw技能系统的核心机制。首先介绍了技能的分层加载逻辑,按照优先级从高到低依次为:工作区专属技能、全局共享技能、出厂自带技能和自定义路径技能。通过流程图展示了从扫描到注册的完整加载流程,并解释了同名技能覆盖规则。随后深入剖析了SKILL.md文件结构,包含YAML元数据定义技能属性和Markdown正文说明使用方法,以公众号写作技能为例展示了具体配置。文章还提供了技能优先级切换的实用技巧,帮助用户灵活管理不同版本的技能。

海兰 239

智能小车倒车入库功能的实现(python,cpp,ubuntu)

智能小车倒车入库功能的实现(python,cpp,ubuntu)

weixin_62135607的博客 5793

深度优先算法 DFS总结(算法详解+模板+例题)

沿着树的深度遍历树的节点,尽可能深的搜索树的分支。共 m+1 行,第 1 行为 2 个数,n 和 m,分别表示一共有 n(n≤105) 篇文章(编号为 1 到 n)以及m(m≤106) 条参考文献引用关系。一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。有一个 n \times mn×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

Alex_Fufu的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

DFS (深度优先算法)

DFS(深度优先搜索算法):一种用于遍历或者树或者图的算法,是一种递归程序,不断递归达到无法在到达的点,简单点来说:一条路一直走,走到没有路后就原路返回,重新选择另一条 dfs(step + 1)。 DFS = 暴搜 + 回溯算法 + 剪枝(大多数是这样)。DFS需要回溯算法,其他算法也需要回溯算法,两种是一种调用关系。 暴搜:一条路走到黑(直接递归走到底) 回溯:DFS开启另一条路则需要回溯,如果暴搜那条路找不到答案就要回溯走另外一条道路。 剪枝:如果明确接下来的搜索找不到答案或者不是最优解,就

qq_46056407的博客 4731

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构_dfs深度优先算法入门(C语言)

数据结构_dfs深度优先算法入门(C语言) 文章目录数据结构_dfs深度优先算法入门(C语言)0.闲话1.个人理解2.全排列问题(1到n的排列组合)2.八皇后问题求解二维迷宫(1)只输走出迷宫解的个数(2)输出解的个数和路径 0.闲话 ​ 才学习数据结构的dfs,做一下笔记记录一下,加深理解-.- ​ 我这里就简单讲一下我的理解和一下例子 ​ 推荐学习资源(B站视频,原理和实例): 洛谷 普及组...

qq_35289660的博客 5299

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言实现一个走迷宫小游戏(深度优先算法)

转载于我的博客园:https://www.cnblogs.com/xiao-qi-w/p/13031637.html 接上一篇万年历博文,还是那位朋友的练习题。这次是使用C语言做一个小游戏程序,三选一(2048、8皇后和迷宫游戏),我选择的是迷宫(文章末尾有源码下载链接以及演示视频链接)。个人认为这个程序的难点在于迷宫地图的绘制,也就是怎么建立一个迷宫。如果迷宫地图是在程序里写死的,那可玩性就大大降低了。那么能不能像正常游戏一样生成一个随机地图呢?当然有!在网上查到的结果不外...

qq_43464624的博客 9481

Unity中DFS深度优先算法

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。 深度优先遍历的过程: 1.从顶点t出发,选择一个与t相连的未被访问过的顶点w。2.然后从w出发,选择与w相连的一个未被访问

qq_38721111的博客 908

迷宫生成算法---深度优先算法(基于python)

迷宫生成算法---深度优先算法总体的目录版权及协议声明1. 深度优先算法的原理与思路二.迷宫的制作迷宫的总体的创建。三.代码的实现 总体的目录 版权及协议声明 本文章遵循CC BY-NC 4.0协议,即允许共享,不允许商用,且必须署名 1. 深度优先算法的原理与思路 首先来看一下算法导论上的解释: 深度优先搜索总是对最近才发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。一但结点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点(v是经过该结点才被发现的),来搜索该前驱结点的出发边。该过

ghost_him的博客 4016

深度优先算法(DFS)洛谷P1683-入门

虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章..这些代码均是我记录自身成长的记录,有写的不好的地方请谅解!先上代码: 开始来一步步解析做法:1.建立数组g[N][N],为什么N=30? 因为题目中给出了范围要求,而我的N=30会比题目大一些,防止莫名其妙的问题.2.为什么选用char类型数组,请看题目给出的样例,他就是一个个字符...3.scanf("%s", g[i]);如何解释这一行代码? 注意,我的for循环i是从0开始到n-1的,这么做是可以直接根据样例输入数据的.4.注意

icudhdhd的博客 1365
上一篇: 数据结构- 图
下一篇: 像素点 --------思路
不问苍生
博客等级 码龄6年 27粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值