用栈和递归求解两顶点的所有简单路径
栈和递归在程序设计中的应用是非常广的,比如对于迷宫的求解、表达式的求解,等都可以用栈来解决,典型的hanoi塔问题,树和图的遍历等都可以用递归来解决,在数据结构等很多书中都有介绍,如果对此不了解,可去参考。递归算法的设计实际上就是对问题的抽象的过程,如果抽象到每个小问题都有相同特征时,那就形成了递归,递归算法简明易懂,下面我就介绍一种利用到栈与递归求解两顶点所有简单路径的问题。
先说明一下什么叫“两顶点的所有简单路径”的概念,“两顶点的所有简单路径”的意思通熟的讲就是在图中有若干点,点与点之间可有边相连(在数据结构中叫“图”),任意设个起点和终点,现在要求的是从起点到终点所有可能通过的边序列的集合。(注:是简单有序边,也就是说简单路径,所谓简单路径就是序列中顶点不重复出现的路径。)举个例子:从上海到北京,我可以直接到达,也可以先到四川,再到北京,或者先到广东,再到北京,等等。如:上海->四川->上海->北京,这就不是简单路径了,显然,不是简单的路径有无数条。
为了描述方便,我用了简单的二维数组来做存储结构。(当然,完全可以用邻接矩阵、邻接表、十字链表、邻接多重表等来表示)* * *
* * *
* * *
如上图左上角的坐标为(1,1),右上角的坐标为(3,1),左下角的坐标为(1,3),右下角的坐标为(3,3),点与点之间都可相通,假设从点(1,1)要到(3,3),有多少种走法?
对这个问题的求解先要认识到它的本质,其本质是一个点有四个方向(各边特殊处理),依次探索四个方向上的点,判断是不是最后的目的地,如果是,则进栈并返回,如果不是则进栈,将此点同样上述处理。显然这个过程是一个递归的过程,直到是最后的目的地,才层层返回。
当然,解决此问题不是只有栈与递归才能解决,经我自己摸索,用生成树的方法访问其双亲结点,也可解决,如果有更好的方法,请多多指教。
相关推荐
关于栈与递归求解迷宫与迷宫最短路径问题
一、栈实现迷宫问题: 问题描述:用一个二维数组模拟迷宫,其中1为墙,0为通路,用栈方法判断迷宫是否有出口,下图为简单模拟的迷宫: 思想: 1.首先给出入口点,如上图入口点坐标为{2,0}; 2.从入口点出发,在其上下左右四个方向试探,若为通路(值为0)时,则向前走,并将每次通路结点入栈(push)保存和标记走过的路为2; 3.当四个方向都没有通路时,则开始回溯,将栈中保存的结点开
关于图中两个顶点间的路径问题
文章目录用DFS算法求顶点u到v的一条简单路径 说明:本文只给出实现的核心算法,具体完整代码请移步我的资源免费下载。 用DFS算法求顶点u到v的一条简单路径 题目描述: 设图G是一个连通图,设计一个算法,利用DFS搜索算法,求图中从顶点u到顶点v的一条简单路径,并输出该路径。 算法思想: 从顶点u开始进行深度优先搜索,如果能够搜索到顶点v,即可求得从顶点u到顶点v的一条简单路径,路径上的每个顶点只访问一次。 为了输出这条路径,可设置一个辅助数组Path[],记录从u到v的路径。 实现代码: void DF
用栈和迭代求解斐波那契数的非递归算法
(1)用栈求解斐波那契数的非递归算法。递归算法为: long Fib( long n){ if(n<=1) return n; else return Fib(n-1) + Fib(n-2); }其递归计算的次序可用如下图所示的递归调用树来描述。为了计算Fib(4),必须先计算Fib(3),为了计算Fib(3),必须先计算Fib(2),再计算Fib(1)及Fib(0),Fib(1)和
基于递归思想运用深度搜索算法实现任意两点间的所有路径搜索(C#)
前言 该算法是在邻接矩阵基础上设计的。可通过修改Init()函数中的邻接矩阵matrix及节点数量node可实现任意想通过邻接矩阵求解任意两点之间所有路径的需求。**值得注意的一点是:**邻接矩阵为无向图,且图中各节点需要依次序列编码,从1开始,一直到node。 本算法不是小弟原创,是借鉴博主https://blog.youkuaiyun.com/weixin_42326299/article/details/90452836中实现的C算法,自己仅仅转化为C#语言实现而已,表示感谢。 初心不变,便于
递归方式求解迷宫问题(对比栈)
前面我们分析的是用队列和栈求解迷宫问题,感兴趣的可以看一下: https目录如下可快速查阅算法描述建立迷宫判断下一步的方向判断失败时回溯 算法描述 我们知道递归和栈其实是很类似的,所以用递归求解的思路与栈的思路大致相同,下面我们来看具体思路: 建立迷宫 首先我们用一个二维数组建立迷宫地图( 其中1表示障碍,0表示可走坐标): 判断下一步的方向 然后我们判断四个方向上、右、下、左(顺时针方向)是否可走,即该位置为空地,无障碍,且未走过(重点): 判断失败时回溯 当我们走到一个结点位置时,发现上
递归和栈求解迷宫的最短路径
采用递归的方式求最短路径 1、用一个栈专门用来保存有效的路径 2、再用一个栈来辅助保存所有走过的路径。 3、然后再用一个栈用来保存最短的路径 4、如果每次找到了出口,那么必然有两个栈一个保存了所有走过的路径,一个保存了通路的路径 5、于是每找到一次出口,那么开始进行比较,如果当前最短路径中所保存的每个坐标的个数如果大于本次通路的路径,那么就将最短路径中的所有数据出栈,并将本次通路的路径放入
js获取打印机列表_图算法 -只需“五步” ,获取两节点间的所有路径(非递归方式)
在实现 “图” 数据结构时,会遇到 “获取两点之间是所有路径” 这个算法问题,网上的资料大多都是利用递归算法来实现(见文末的参考文章)。我们知道在 JS 中用递归算法很容易会让调用栈溢出,为了能在生产环境中使用,必须要用非递归方式的去实现。经过一番探索,实现的思路主要来自文章 《求两点间所有路径的遍历算法》 ,只是该文中并没有给出具体的实现细节,需要自己去实现;最终本文的实现结合类似《算法 - 调...
DFS求解迷宫问题(输出所有的路径)
问题:给出一个n*n的迷宫,起点为(0,0),终点为(n-1,n-1).可以向上、下、左、右四个方向走. 任务:1.判断是否有可行路径 2.如果有可行路径,输出所有的可行路径. ———————————————————————————————————————————————————— 如下图所示,当前位置为中间点,如果中间点不是终点,那么会从4个方向进行下一步探测,进入
python&DFS查找两点所有路径(非递归)
无向图的DFS非递归
用栈和递归解决迷宫问题
今天讲的是一个关于迷宫的面试题,首先咱们先看一下他的简单版本,模型如下图: 利用递归把问题简单化,找入口到出口的问题可以转化为从入口四周的合法的点到出口的问题,一旦找到就结束整个递归,在找得同时把能走得路压到一个栈里面,如果
python实现:图(查找一条路径、全部路径、最短路径)
图 图是非线性的数据结构,由顶点和边组成。如果图中的顶点是有序的,那么图是有方向的,称之为有向图;否则,图是无向图。在图中,由顶点组成的序列称为路径。 在python中,可以采用字典的方式来创建图,图中的每个元素都是字典中的键,该元素所指向的图中其他元素组成键的值。 与树一样,对于图来说,也可以对其进行遍历。除了遍历外,还可以从图中搜索从一个顶点到另一个顶点的所有...
java使用链式栈实现递归和非递归求解迷宫路径
给定任意设定的迷宫,左上角为入口,有下角为出口,判断该迷宫是否存在通路,若有,则非递归求解迷宫的一条通路以及三元组路径,并且递归求解迷宫的所有通路以及对应的三元组路径;若无,则提示该迷宫无路。
链式栈在Java中实现迷宫路径求解
在计算机科学和图论领域,迷宫路径求解是一个经典的搜索问题,它不仅有助于理解复杂问题的求解方法,还能加深对数据结构和算法概念的理解。迷宫问题的核心是寻找一条从起点到终点的路径,要求路径是连续的,并且在某些规则约束下,比如不能经过特定的墙或者障碍物。本章将简要介绍迷宫路径求解问题,并概述该问题的求解方法及其应用价值。迷宫路径求解问题可以通过多种算法来实现,常见的算法包括深度优先搜索(DFS)、广度优先搜索(BFS)等。这些算法都能够有效地在图或矩阵中寻找一条路径。
C语言课程设计-迷宫问题的求解
需求分析 问题描述 要求使用链栈非递归的形式求解迷宫问题,并用递归的方式求解全部可能的路径。 首先需要写好链栈的相关操作,如初始化,判空,入栈,出栈等等。并且熟练使用栈的相关操作。 其次对于迷宫问题,需要使用非递归的方式,就需要将朴素的递归搜索方式,借助链栈转换成非递归的方式。 对于求出全部可能路径,可以使用类似图的深度优先搜索的方式,依次求解出路径 基本要求 输入的形式和...
判别图中两个顶点之间的简单路径
application/x-rar 判别图中两个顶点之间的简单路径
判别图中两个顶点之间的简单路径的程序设计
判别图中两个顶点之间的简单路径的程序设计 数据结构课程设计
递归求解迷宫中所有迷宫路径(数据结构学习笔记)
文章目录递归求解迷宫问题迷宫题目算法思路算法代码算法设计完整代码最终迷宫路径算法总结 递归求解迷宫问题 有些问题可以使用递归方法求解,将大问题分解成求解方法相同的小问题。递归调用必须有的两个因素:1、有递归出口,2、有递归体。并且递归调用的次数总是有限的。 迷宫题目 设计算法输出所有的迷宫路径,其中(1,1)为入口,(4,4)为出口。(规定以0为可走方块,1为不可走方块) int mg[M+2][N+2]= //M=4,N=4 { {1, 1, 1, 1, 1, 1},
JDK8升级JDK17过程中遇到的那些坑
JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。
【详解】求解迷宫所有路径(递归实现)----直接打穿迷宫
介绍了递归算法的模型和栈帧的一些基本概念,和递归算法的一个应用求解迷宫所有路径(递归实现)超详细。
【企业微信自建应用-前端篇】企业微信自建应用开发流程详细介绍
最近接到需求,需要我在企业微信端自建一个应用,用来接受PC端派发的工单,告警,公告等内容。这里写一个帖子汇总一下我经历的全流程开发,当然这是基础的流程啊。因为功能要求也不高。后面如果开发更多的东西再补充。
无需Root!安卓模拟器+BurpSuite轻松搞定微信小程序抓包
本文详细介绍了如何在不root安卓设备的情况下,使用安卓模拟器和BurpSuite实现微信小程序抓包。通过夜神模拟器降级安卓版本、配置BurpSuite代理及安装证书等步骤,开发者可以轻松绕过微信的证书绑定,高效抓取小程序数据包。文章还提供了常见问题排查和高阶技巧,帮助开发者提升抓包效率。
4181



被折叠的 条评论
为什么被折叠?



