【详解】求解迷宫所有路径(递归实现)----直接打穿迷宫

目录

递归的模型:

栈帧:

递归调用深度:

​编辑

用递归算法求解迷宫问题:

小结:

结语:


递归的小小总结,朋友们可以看看,有助于理解后面的递归程序。

递归的模型:

递归模型由递归出口递归体两部分组成,递归出口即递归的结束条件,递归体确定递归求解时的递推关系。

这两步缺一不可,没出口会死循环,没有递归体求解不出答案。(建议大家做递归题时一定要在纸上把这两个写出来,递归代码实现不难,难的是思路

栈帧:

单个函数调用操作所使用的函数调用栈被称为栈帧结构简单来说就是每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。

递归调用深度:

类似于这样的递归调用深度为4,其实就是大问题化到递归出口需要调用递归函数的次数。

深度不能太大,会栈溢出。

用递归算法求解迷宫问题:

自定义PathType来存储每一步的数据

Box为每个点的数据类型

用count来存储一共有几条路可以走

大部分解析都在代码里面了,我这里就不多叙述。

typedef struct
{int i;				//当前方块的行号int j;				//当前方块的列号
} Box;
typedef struct
{Box data[MaxSize];int length;			//路径长度
} PathType;				//定义路径类型
int count=0;			//存放迷宫路径的条数

求解迷宫函数mgpath参数xi,yi为当前的坐标,xe,ye为迷宫出口的坐标,path用来保存每一步,一但找到出口就把path输出(path其实是顺序表结构),可能有的朋友不太懂为什么要回退,这是因为我们要找迷宫的所有出口,进行回溯,这样递归就能进行全部查找,和树差不多(由于这样的空间消耗很大,和时间复杂度较高,所以迷宫不适合太大)。

void mgpath(int xi,int yi,int xe,int ye,PathType path)
//求解路径为:(xi,yi)->(xe,ye)
{int di,k,i,j;if (xi==xe && yi==ye)		//找到了出口,输出路径{path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;printf("迷宫路径%d如下:\n",++count);for (k=0;k<path.length;k++)printf("\t(%d,%d)",path.data[k].i,path.data[k].j);printf("\n");}else						//(xi,yi)不是出口{if (mg[xi][yi]==0)		//(xi,yi)是一个可走方块{di=0;while (di<4)		//找(xi,yi)的一个相邻方块(i,j){switch(di){case 0:i=xi-1; j=yi;   break;case 1:i=xi;   j=yi+1; break;case 2:i=xi+1; j=yi;   break;case 3:i=xi;   j=yi-1; break;}path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;mg[xi][yi]=-1;			//避免重复找路径mgpath(i,j,xe,ye,path);path.length--;			//回退一个方块mg[xi][yi]=0;			//恢复(xi,yi)为可走di++;}}}
}

总代码:

#define  _CRT_SECURE_NO_WARNINGS 1
//【例5.5】的算法:递归算法求解从入口到出口的所有迷宫路径
#include <stdio.h>
#define MaxSize 100
#define M 4
#define N 4
int mg[M+2][N+2]={ {1,1,1,1,1,1},{1,0,0,0,1,1},{1,0,1,0,0,1},{1,0,0,0,1,1},{1,1,0,0,0,1},{1,1,1,1,1,1} };typedef struct
{int i;				//当前方块的行号int j;				//当前方块的列号
} Box;
typedef struct
{Box data[MaxSize];int length;			//路径长度
} PathType;				//定义路径类型
int count=0;			//存放迷宫路径的条数
void mgpath(int xi,int yi,int xe,int ye,PathType path)
//求解路径为:(xi,yi)->(xe,ye)
{int di,k,i,j;if (xi==xe && yi==ye)		//找到了出口,输出路径{path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;printf("迷宫路径%d如下:\n",++count);for (k=0;k<path.length;k++)printf("\t(%d,%d)",path.data[k].i,path.data[k].j);printf("\n");}else						//(xi,yi)不是出口{if (mg[xi][yi]==0)		//(xi,yi)是一个可走方块{di=0;while (di<4)		//找(xi,yi)的一个相邻方块(i,j){switch(di){case 0:i=xi-1; j=yi;   break;case 1:i=xi;   j=yi+1; break;case 2:i=xi+1; j=yi;   break;case 3:i=xi;   j=yi-1; break;}path.data[path.length].i = xi;path.data[path.length].j = yi;path.length++;mg[xi][yi]=-1;			//避免重复找路径mgpath(i,j,xe,ye,path);path.length--;			//回退一个方块mg[xi][yi]=0;			//恢复(xi,yi)为可走di++;}}}
}
int main()
{PathType path;path.length=0;				//初始化路径长度mgpath(1,1,M,N,path);return 1;
}

小结:

递归问题一般都要先把解题思路想好,再进行解答,有时递归的深度比较大,可能要自己转换为递推形式,然后就相信函数,相信自己,有一些小细节不必深究(不然你可能就会陷入无穷的细节无法自拔)。

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞和收藏,这可以激励我写出更加优秀的文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】冰峰VPN存在敏感信息泄露漏洞

漏洞描述 冰峰VPN log/system.log模块日志信息泄露漏洞 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利…

网络优化篇(一)---------TCP重传性能优化

本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。 通过本文你将学到: 如何通过linux命令和/proc文件系统分析TCP性能数据如何通过linux命令和netlink api分析某个具体的TCP连接的性能数据如何通过bcc工具分析TCP性能数据如何通过调整系统参数优化TCP重…

近屿智能OJAC带您从0到1全方位深度学习AI大模型,星辰大海和你开创!

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 在这个信息爆炸的数字时代&#xff0c;你是否也想掌握那种像魔法一样的AI技…

Linux下从sqlite3源码编译出sqlite3库及相关可执行程序

目录 1. 下载sqlite3源码并编译 2. 下载Tcl库并编译 3. 再次编译sqlite源码 1. 下载sqlite3源码并编译 打开SQLite Download Page&#xff0c;滚动到页面的下面&#xff0c;找到源码量最大的那个&#xff08;其它的估计也行&#xff0c;但源码最大的本人感觉功能最全&#…

JavaWeb 页面上显示中文乱码解决~

你们好&#xff0c;我是金金金。 场景 我正在学习servlet&#xff0c;通过write()方法向页面上写入中文数据&#xff0c;没想到显示的都是?? 乱码&#xff0c;如图 排查 很明显可以看出来页面上显示的是??&#xff0c;我猜想肯定是字符编码的问题&#xff0c;导致乱码 造成…

优化|流形优化系列(一)

简介 流形优化是非线性优化的一个分支&#xff0c;它主要关注在特定的几何结构下进行优化。在流形优化中&#xff0c;优化问题通常是在黎曼流形上进行的&#xff0c;而非欧几里得空间。黎曼流形是带有黎曼度量的流形&#xff0c;该度量为流形上的每个点都定义了一个内积。这种…

YOLOv5改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA(多尺度空洞注意力)发表于今年的中科院一区(算是国内计算机领域的最高期刊了),其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是通过线性投影得到特征图X的相应查…

APP自动化测试工具:八款推荐解析

如果想学习提升找不到资料&#xff0c;没人答疑解惑时&#xff0c;请及时加入群&#xff1a;1150305204&#xff0c;里面有各种测试开发资料和技术可以一起交流哦。 uiautomator2 github地址&#xff1a;github.com/openatx/uia… UiAutomator 是 Google 提供的用来做安卓自动…

linux虚拟机网络不通,如何配置ip解决网络问题

续接前文 Hyper-V创建linux虚拟机&#xff0c;共享wifi网络-CSDN博客 创建虚拟机后&#xff0c;网络都正常&#xff0c;可以使用&#xff0c;今天的一次异常关机后&#xff08;电源不小心拔掉了&#xff09;&#xff0c;再次打开这个虚拟机&#xff0c;网络都失效了。。。。 …

C++: 求1+2+3+...+n

int i 1; int sum 0; class Sum { public:Sum(){sum i;i;} };class Solution { public:int Sum_Solution(int n) {Sum a[n]; //调用n次sum的构造函数return sum;} };

云服务器安装mysql全流程

一、下载安装包 官网链接&#xff1a;MySQL :: Download MySQL Community Server 选择适合自己版本和操作系统 二、安装包上传服务器 在本地终端执行scp命令 三、服务器上使用安装包 卸载旧版本 #检查是否之前安装过mysql服务 [lighthouseVM-24-3-opencloudos software]# r…

基于Java SSM框架实现固定资产管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现固定资产管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

面向对象软件设计与分析40讲(35)软件开发过程模型之瀑布模型

文章目录 1 定义2 **缺点**3 **优点**1 定义 瀑布模型是一种软件开发过程模型,它将软件开发过程划分为一系列阶段,并且每个阶段必须按照顺序完成,前一个阶段完成后才能进入下一个阶段,形如瀑布流水,最终得到软件产品。这些阶段通常包括需求分析、设计、编码、测试和维护等…

lombok注解 @Data使用在继承类上时出现警告解决

一、警告问题 1、Data注解 Data 包含了 ToString、EqualsAndHashCode、Getter / Setter和RequiredArgsConstructor的功能。 当使用 Data注解时&#xff0c;则有了 EqualsAndHashCode注解&#xff08;即EqualsAndHashCode(callSuperfalse)&#xff09;&#xff0c;那么就会在此…

uniapp中uview组件库CircleProgress 圆形进度条丰富的使用方法

目录 #内部实现 #平台差异说明 #基本使用 #设置圆环的动画时间 #API #Props 展示操作或任务的当前进度&#xff0c;比如上传文件&#xff0c;是一个圆形的进度环。 #内部实现 组件内部通过canvas实现&#xff0c;有更好的性能和通用性。 #平台差异说明 AppH5微信小程…

Vue2 - computed 和 method 的原理区别

目录 1&#xff0c;简单对比2&#xff0c;原理的不同1&#xff0c;method 的处理2&#xff0c;computed 的处理实现缓存触发更新 3&#xff0c;触发更新时的问题 1&#xff0c;简单对比 computed 当做属性使用&#xff0c;method 当做方法使用。computed 可以提供 getter 和 s…

Java研学-web操作crud

一 思路 1 组件 页面显示&#xff1a;JSP   接受用户请求&#xff1a;Servlet   和数据库交互&#xff1a;MyBatis 2 基础准备 ① 创建 web 项目&#xff0c;导入需要依赖的 jar 包,放入 web/WEB-INF/lib目录中 ② 创建数据库表 CREATE TABLE employee( id bigint(11)…

P12 音视频复合流——TS流讲解

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

限制选中指定个数CheckBox控件(1/2)

限制选中指定个数CheckBox控件&#xff08;1/2&#xff09; 实例需求&#xff1a;工作表中有8个CheckBox控件&#xff08;下文中简称为控件&#xff09;&#xff0c;现在需要实现限制用户最多只能勾选4个控件。 Dim OnDic As Object Sub CheckboxeEvent()Dim oCB As CheckBox…

OpenSource - File Preview 文件预览组件

文章目录 file-preview-spring-boot-starterkkFileView file-preview-spring-boot-starter https://github.com/wb04307201/file-preview-spring-boot-starter https://gitee.com/wb04307201/file-preview-spring-boot-starter 一个文档在线预览的中间件&#xff0c;可通过简…