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

目录

递归的模型:

栈帧:

递归调用深度:

​编辑

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

小结:

结语:


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

递归的模型:

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

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

栈帧:

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

递归调用深度:

类似于这样的递归调用深度为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.hqwc.cn/news/326834.html

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

相关文章

Python如何求解最长公共子序列

Python-求解两个字符串的最长公共子序列 一、问题描述 给定两个字符串&#xff0c;求解这两个字符串的最长公共子序列&#xff08;Longest Common Sequence&#xff09;。比如字符串1&#xff1a;BDCABA&#xff1b;字符串2&#xff1a;ABCBDAB。则这两个字符串的最长公共子序…

第14课 利用openCV快速数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

UI5与后端的文件交互(一)

文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使用Basic模板创建2. 创建View3. 测试页面及绑定的oData数据是否正确4. 创建Controller5. 导入外部包&am…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容&#xff0c;…

基于数据库和NER构建知识图谱流程记录

文章目录 环境准备拓扑设计构建流程设计文件流设计交互解析算法实现数据库交互NER解析相似度计算 基于数据库的文件生成从数据库中读取字段将字段后处理后保存为文件 基于文件的知识图谱构建bug修改与算法优化图数据库连接问题批量构建知识图谱问题批量删除边问题空值处理问题去…

【高效视频处理】BMF 项目安装与老视频修复体验全流程及总结

一、BMF简介 BMF&#xff08;Babit Multimedia Framework&#xff09;是字节跳动开发的跨平台、多语言、可定制的多媒体处理框架。经过 4 年多的测试和改进&#xff0c;BMF 已经过量身定制&#xff0c;能够熟练地应对我们现实生产环境中的挑战。目前广泛应用于字节跳动的视频串…

Idea启动运行“错误:java: 无效的源发行版: 13”,如何解决?

以上是以JDK1.8的项目作为举例&#xff0c;如果您用的是其他版本请选择对应的language level idea中项目的language level的含义 language level指的是编译项目代码所用的jdk版本。那么&#xff0c;从这个定义出发会有两个小问题。 ❶ 如果project sdk是jdk8&#xff0c;那么la…

c# OpenCvSharp透视矫正参数调整器

透视矫正不够智能化&#xff0c;每次都要进行局部参数调整&#xff0c;不便于程序使用&#xff0c;程序流程还是那几个步骤&#xff1b; 1、读取图像、灰度化 2、高斯滤波 3、二值化 4、边缘检测 灰度化图 上个图看看经过调整透视矫正边缘检测结果我还是挺满意的 发现一个…

云原生学习系列之基础环境准备(单节点安装kubernetes)

一、环境要求 操作系统CentOS 7.x-86_x64 硬件配置&#xff1a;内存2GB或2G&#xff0c;CPU 2核或CPU 2核&#xff0c;需要在虚拟机中提前设置好&#xff0c;不然后续会报错 二、系统初始化 1、设置主机名 # 在master节点执行 hostnamectl set-hostname master01 2、配置主…

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

基础语法(一)(1)

常量和表达式 在这里&#xff0c;我们可以把Python当成一个计算器&#xff0c;来进行一些算术运算 例如&#xff1a; print(1 2 - 3) print(1 2 * 3) print(1 2 / 3)注意&#xff1a; print是一个python内置的函数&#xff0c;这个稍后我们会进行介绍 可以使用-*/&…

数据库攻防学习之MySQL

MySQL 0x01mysql学习 MySQL 是瑞典的MySQL AB公司开发的一个可用于各种流行操作系统平台的关系数据库系统&#xff0c;它具有客户机/服务器体系结构的分布式数据库管理系统。可以免费使用使用&#xff0c;用的人数很多。 0x02环境搭建 这里演示用&#xff0c;phpstudy搭建的…