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

目录

递归的模型:

栈帧:

递归调用深度:

​编辑

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

小结:

结语:


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

递归的模型:

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

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

栈帧:

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

递归调用深度:

类似于这样的递归调用深度为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;但源码最大的本人感觉功能最全&#…

uView DatetimePicker 选择器

此选择器用于时间日期 #平台差异说明 App&#xff08;vue&#xff09;App&#xff08;nvue&#xff09;H5小程序√√√√ #基本使用 通过show绑定一个布尔值变量&#xff0c;用于控制组件的弹出与收起。通过mode配置选择何种日期格式。 <template><view><u…

【实用工具】网站整站下载

SiteSucker SiteSucker 是一款用于 macOS 系统的应用程序&#xff0c;它允许用户下载整个网站的内容到本地存储设备。这个应用的主要功能是将网站的 HTML、图像、样式表和其他相关文件下载到您的计算机&#xff0c;从而使您能够在没有互联网连接的情况下浏览整个网站。SiteSuc…

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

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

VPC网络架构下的网络上数据采集

介绍 想象这样一个场景&#xff0c;一开始在公司里&#xff0c;所有的部门的物理机、POD都在一个经典网络内&#xff0c;它们可以通过 IP 访问彼此&#xff0c;没有任何限制。因此有很多系统基于此设计了很多点对点 IP 直连的访问&#xff0c;比如中心控制服务器 S 会主动访问物…

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

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

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

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

编程笔记 html5cssjs 028 HTML输入属性(2/2)

[TOC](编程笔记 html5&css&js 028 HTML输入属性(2/2)) HTML5新半了很多输入属性。使表单输入更加细致&#xff0c;减少了页面编程的复杂性。 HTML5 输入属性 HTML5 为 增加了如下属性&#xff1a; autocomplete autofocus form formaction formenctype formmethod for…

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

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

K8S----PVPVCSC

一、简介 1、PV(persistent volume)–持久卷 PV是集群中的一块存储,可以由管理员事先静态(static)制备, 也可以使用存储类(Storage Class)来动态(dynamic)制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件(volume p…

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…

195.【2023年华为OD机试真题(C卷)】5G 网络建设(最小生成树—JavaPythonC++JS实现)

请到本专栏顶置查阅最新的华为OD机试宝典 点击跳转到本专栏-算法之翼:华为OD机试 🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,深度掌握! 文章目录 【2023年华为OD机试真题(C卷)】5G 网络建设(最小生…

我与编程的不解之缘:从Basic到大数据的漫漫探索之旅

我与编程的不解之缘&#xff1a;从Basic到大数据的漫漫探索之旅 时光倒流至1984年的初中课堂&#xff0c;那一年&#xff0c;我遇见了Tom计算机和Basic语言。在那个科技启蒙的年代&#xff0c;当我初次敲击键盘&#xff0c;在Tom机上编写出第一个“Hello, World!”程序时&#…

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

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

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

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