java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频
递归算法能够解决很多计算机科学问题,迷宫问题就是其中一个典型案例。本篇教程我们将采用递归算法求解迷宫问题,输出从入口到出口的所有迷宫路径。
01
用递归算法解决迷宫问题
迷宫问题在《数据结构教程》第3章介绍过,设mgpath(int xi,int yi,int xe,int ye,path)是求从(xi,yi)到(xe,ye)的迷宫路径,用path变量保存一条迷宫路径,它是元素为Box类型的ArrayList对象,其中Box类定义如下:
class Box //方块类
{ int i; //方块的行号int j; //方块的列号public Box(int i1,int j1) //构造方法{ i=i1;j=j1;}
}
当从(xi,yi)方块找到一个相邻可走方块(i,j)后,mgpath(i,j,xe,ye,path)表示求从(i,j)到出口(xe,ye)的迷宫路径。显然,mgpath(xi,yi,xe,ye,path)是“大问题”,而mgpath(i,j,xe,ye,path)是“小问题”(即大问题=试探一步+小问题),如下图所示。
▍大小问题的关系
求解上述迷宫问题的递归模型如下:
mgpath(xi,yi,xe,ye,path)将(xi,yi)添加到path中; 若(xi,yi)=(xe,ye)即找到出口置mg[xi][yi]=-1;输出path中的迷宫路径;恢复出口迷宫值为0即置mg[xe][ye]=0mgpath(xi,yi,xe,ye,path)将(xi,yi)添加到path中; 若(xi,yi)不是出口置mg[xi][yi]=-1;对于(xi,yi)每个相邻可走方块(i,j),调用mg(i,j,xe,ye,path);path回退一步并置mg[xi][yi]=0;
上述递归模型中,对于方块(xi,yi),先添加到path末尾(所有path中的方块都是通道,所以初始调用时入口必须是通道),对于它的每一个相邻可走方块(i,j)都执行“小问题”mgpath(i,j,xe,ye,path),之后需要从(xi,yi)方块回退(删除path中的末尾方块)并置mg[xi][yi]为0,其目的是恢复前面求迷宫路径而改变的环境,以便找出所有的迷宫路径。以下图的迷宫为例:
▍迷宫示意图
求入口(1,1)到出口(4,4)所有迷宫路径的完整程序如下:
import java.lang.*;import java.util.*;class Box //方块类{ int i; //方块的行号 int j; //方块的列号 public Box(int i1,int j1) //构造方法{ i=i1;j=j1;}}class MazeClass //求解迷宫路径类{ final int MaxSize=20; int [][] mg; //迷宫数组 int m,n; //迷宫行列数 int cnt=0; //累计迷宫路径数 public MazeClass(int m1,int n1) //构造方法{ m=m1; n=n1; mg=new int[MaxSize][MaxSize]; } public void Setmg(int [][] a) //设置迷宫数组{ for (int i=0;i for (int j=0;j mg[i][j]=a[i][j]; } void mgpath(int xi,intyi,intxe,intye,ArrayList path) //求解迷宫路径为:(xi,yi)->(xe,ye){ Box b; int di,i=0,j=0; b=new Box(xi,yi); path.add(b); //将(xi,yi)添加到path中 mg[xi][yi]=-1; //mg[xi][yi]=-1 if (xi==xe&&yi==ye) //找到了出口,输出一个迷宫路径 { System.out.printf("迷宫路径%d:",++cnt); //输出path中的迷宫路径 for (int k=0;k System.out.printf(" (%d,%d)",path.get(k).i,path.get(k).j); System.out.println(); mg[xi][yi]=0; //恢复为0,否则别的路径找不到出口 } else //(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; } if (mg[i][j]==0) //(i,j)可走时 mgpath(i,j,xe,ye,path); //从(i,j)出发查找迷宫路径 di++; //继续处理(xi,yi)下一个相邻方块 } } path.remove(path.size()-1); //删除path末尾方格(回退一个方块) mg[xi][yi]=0; }}public class Exam5_5{ public static void main(String[] args){ int [][] a= { {1,1,1,1,1,1},{1,0,1,0,0,1}, {1,0,0,1,1,1},{1,0,1,0,0,1}, {1,0,0,0,0,1},{1,1,1,1,1,1} }; MazeClassmz=new MazeClass(6,6); ArrayList path=new ArrayList(); mz.Setmg(a); mz.mgpath(1,1,4,4,path); }}
上述程序的执行结果如下:
迷宫路径1: (1,1) (2,1) (3,1) (4,1) (4,2) (4,3) (3,3) (3,4) (4,4)迷宫路径2: (1,1) (2,1) (3,1) (4,1) (4,2) (4,3) (4,4)
本例算法求出所有的迷宫路径,可以通过路径长度比较求出最短迷宫路径(可能存在多条最短迷宫路径)。
02
视频讲解
视频教程如下:
03
源代码下载
关注微信公众号,后台回复关键词“迷宫问题”即可获得完整源代码。
【参考书籍】
《数据结构教程(Java语言描述)》
ISBN:978-7-302-55134-8
李春葆 编著
定价:69.8元
上一篇:
用Python写一个智力问答游戏 | 附代码+视频
利用神经网络实现股票预测 | 附代码
java 递归_采用递归算法求解迷宫问题(Java版) | 附代码+视频相关推荐
- Java 通用代码生成器光 2.3.0 文明 Beta10 版发布介绍视频,支持从源码构建
Java 通用代码生成器光 2.3.0 文明 Beta10 版发布介绍视频,支持从源码构建 Java 通用代码生成器光 2.3.0 文明 Beta10 版发布最新介绍视频,详细介绍 java 通用代码 ...
- python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
目的:能将栈运用的更为熟练 实验内容:求解迷宫问题程序,要求输出如图所示的迷宫的路径,并求出第一条最短路径的长度以及最短路径. 设计的算法功能: mgpath(int xi,int yi,int xe ...
- lambda 对象去重_采用java8 lambda表达式 实现 java list 交集 并集 差集 去重复并集...
采用java8 lambda表达式 实现java list 交集/并集/差集/去重并集 一般的javaList 交.并集采用简单的 removeAll retainAll 等操作,不过这也破坏了原始的 ...
- 约瑟夫问题java 递归_从约瑟夫问题的递归实现的问题说起
在解决约瑟夫问题时,我比较推荐使用递归,因为递归实现的算法代码更短,逻辑也更清晰,然而很多人有一个疑问,那就是他们知道递归层数是有极限的,这就意味着当需要很大层数的递归时,递归算法是不可行的,会导致段 ...
- 第三方工具监控java进程_前9个免费的Java进程监视工具以及如何选择一种
第三方工具监控java进程 这样就可以运行Java代码了. 也许它甚至可以在生产服务器上运行. 当您做好工作后,我们得到了好消息和令人讨厌的消息. 令人讨厌的消息是,现在开始调试. 就是进行调试和应用 ...
- 斐波那契数java实现_斐波那契数列Java实现[剑指offer]
描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 题解 1.递归实现 采用递归的方式进行实现时,从第n个节点向下递归时,存 ...
- java 报表_市占率第一的Java报表工具 - FineReport报表工具
作为国产Java报表工具的优秀代表,FineReport报表工具不仅仅在报表设计的简单易用上表现出极大的优势,更在数据分析等复杂报表处理能力和报表管理等报表综合应用上凸显出其报表技术的成熟和领先. 一 ...
- 小白学习python好还是java好_小白应该学Python还是Java?
Java和Python两门语言都是目前非常热门的语言,可谓北乔峰南慕容,二者不分上下,棋逢对手.但是对于初学者来说,非常困惑,因为时间和精力有限,上手必须要先学一门,到底选那个好呢,今天3分钟带你透彻 ...
- cmd编译java命令_使用CMD命令编译执行java命令
写程序时,有时候需要动态编译执行,经过各种百度及实战,总结一些使用经验. .java文件分为有包名,无包名,又分为有jar包,无jar包,是否指定jre等等. 接下来总结如下: cmd 编译执行jav ...
最新文章
- 让PyTorch训练速度更快,你需要掌握这17种方法
- laravel 5.1 Eloquent常见问题
- 《F# Deep Dives》书评与作者问答
- Mysql 乱码的解决
- 继承的CSS类在Chrome开发者工具里的显示
- android sdk64位资源,android SDK 有32位或64位的分别吗
- Java常用集合笔记
- matlab怎么调出来的,如何调出MATLAB内部函数的源程序?
- oracle提高like速度,sql语句提升like效率
- 利用MeGUI实现批量转换视频
- nginx ajax 504,内网配置错误引起的nginx 504 Connection timed out
- 35岁是个坎,为啥到岁数就不想要你了
- TCP-Drinc:Smart Congestion Control Based on Deep Reinforcement Learning笔记
- 实践▍用大数据扒一扒蔡徐坤的真假流量粉 | Alfred数据室
- 微软 bing 壁纸 每日一图 bing api
- lodop打印,仿超市小票,银行排队小票,超好用-jatoolsprinter
- 程序:摄氏度和华氏度的相互转化
- 如何设置过滤器Filter
- 投资理财学习笔记四,1.6那些必知的宏观经济指标(上)
- java实现多个mav文件拼接合并成一个mav文件
热门文章
- Android - 布局详解之LinearLayout与RelativeLayout
- VB.NET 中的 As New 以及型別指定
- 计算机网络——分层结构,协议,接口和服务
- MFC关键技术-消息映射机制
- 计算机类对口升学都可以升啥专业,计算机专业对口升学专业试题.doc
- matlab重叠相加法求卷积,通过重叠相加法实现卷积的报告.doc
- java 线程变量put_Java线程(篇外篇):线程本地变量ThreadLocal
- android 发送广播_从0系统学Android--5.2 发送广播
- linux 检测mysql链接_MySQL笔记
- MATLAB获得子图位置