Java 算法之迷宫(简单实现)
最近在学习算法,又又看到了一个挺有趣的题目,就是走迷宫,就写了一篇简单实现走迷宫的算法,就只是找到一条出路,你问为啥不写复杂一点,因为作者想留给你们写(就是懒得考虑那么多dog)。如果有小伙伴需要考虑复杂一些的,比如输出多条路线,或者多条路线找到最简等要求,可以给我留言,我在出一个2.0迷宫(正大光明水文章)。
说明
走迷宫是递归求解的基本题型,我们在二维阵列中使用1表示迷宫墙壁,使用0表示行走的路径,找到从入口至出口的路线。
从第一行的第一个元素为入口,走到最后一行的最后一个元素为出口
0 1 1 1 0 0 0 10 1 0 00 1 1 0
* 1 1 1 这个就是路线 * * * 10 1 * *0 1 1 *
提示:下一步进入我们最喜欢的解题思路环节。
解题思路
上面我们已经画出了行走路线,但是要怎么才能实现那?
1: 第一步
我们理所应当要先考虑怎么实现行走,这个很简单,我们只需要在原先的二维坐标上面进行操作,比如(a,b),我们给 a+1 就实现了向下,a-1 向上 ,b+1 向右,b-1 向左,这样就解决了行走。
2: 第二步
我们需要考虑边界问题,如果你不考虑,那么恭喜你将喜提ArrayIndexOutOfBoundsException
异常(数组索引越界异常)。因为是二维数组嘛,所以最小我们要考虑大于等于0,最大只能是小于数组的长度(数组的行和列)
3: 第三步 (核心)
这步也是核心,我用的是递归解法,不懂的小伙伴需要去了解一下递归的思想(有时间我也写一写递归)。除了第一步,后面的每一步我们都可以考虑最大有四种行走的可能,我们可以写四个方法,分别代表向上、下、左、右移动,行走后是否等于 0 ,也就是是否可以接着行走(可以接着行走,再次调用我们的方法),一直到最后每一个方法都不成立,达到递归返回的条件,这个时候无非两种情况,要么走到死胡同,要么成功了。成功,我们只需要判断这个下标是否为出口点就可以了,然后递返。如果是死胡同,就递返到有交叉出口的地方,也就是能调用两种及以上行走方法的地方,接着走下一条路线。(这里有点绕可以多看看,因为递归有点抽象,不好理解,也不好说)。
所以我画了一个图方便理解。
我们可以看到从起点开始,代替移动的四个方法只有向下满足,所以这时候只能向下移动,到分叉路口,这个时候移动会根据我们写的移动方法的顺序,接着移动,这里假如是向下的方法优先,就会先向下移动。走蓝色的路线,走到最下面,然后进行判断,走到死胡同了,然后触发我们设置的递归条件,进行递返,一直到交叉口的位置,走红色路线,然后进行判断,在进行递返。
注意!
我们需要留心的一个小细节,当我们走到一个点的时候,需要改变走过点的值,因为你到下一步,四种可能当中就一定会满足你刚刚走过的点,这样你就又走回去了。
代码
不要看代码多,很多都是每一步的注解,和一些数据的输出,关键代码不多
public class Test {public static void main(String[] args) {//走迷宫String [][]source = {{"0", "0", "1", "1", "1"},{"1", "0", "1", "1", "0"},{"0", "0", "0", "0", "0"},{"1", "0", "1", "1", "0"},{"0", "0", "1", "1", "0"},{"0", "1", "0", "0", "0"},{"0", "0", "0", "1", "0"}};//输出原始数据for(int i = 0 ; i < source.length ; i++){for(int j = 0 ; j < source[i].length ; j++){System.out.print(source[i][j] + " ");}System.out.println();}//调用移动的方法 (0,0)为我们设置的起点move(0, 0, source);System.out.println("--------------");for(int i = 0 ; i < source.length ; i++){for(int j = 0 ; j < source[i].length ; j++){System.out.print(source[i][j] + " ");}System.out.println();}}public static int move(int a, int b, String [][]source){//移动的四个方向int ad = a + 1; //下int ax = a - 1; //上int bd = b + 1; //右int bx = b - 1; //左//判断是否满足边界条件if(ad < source.length){//下 如果能走下一步接着调用移动方法if(source[ad][b] == "0"){//给走过的路线标记 * 号避免,刚走了下一步,到下一个点又执行向上source[a][b] = "*";//如果等于 1 表示找到出口 然后一直返回(触发递归的条件)if(move(ad, b, source) == 1){source[a][b] = "-";System.out.println(a + "," + b);return 1;}}}if(ax >= 0){//上if(source[ax][b] == "0"){source[a][b] = "*";if(move(ax, b, source) == 1){source[a][b] = "-";System.out.println(a + "," + b);return 1;}}}if(bd < source[a].length){//右if(source[a][bd] == "0"){source[a][b] = "*";if(move(a, bd, source) == 1){source[a][b] = "-";System.out.println(a + "," + b);return 1;}}}if(bx >= 0){//左if(source[a][bx] == "0"){source[a][b] = "*";if( move(a, bx, source) == 1){source[a][b] = "-";System.out.println(a + "," + b);return 1;}}}source[a][b] = "*";//出口点if(a == 5 && b == 4){System.out.println("有出口");//输出成功的每一个点System.out.println(a + "," + b);source[a][b] = "-";//返回 1 代表成功 0 失败return 1;}return 0;}}
结果
最下面带 - 就是我们的成功的路线,带 * 就是我们走过的但是不通的路线
0 0 1 1 1
1 0 1 1 0
0 0 0 0 0
1 0 1 1 0
0 0 1 1 0
0 1 0 0 0
0 0 0 1 0
有出口
5,4
5,3
5,2
6,2
6,1
6,0
5,0
4,0
4,1
3,1
2,1
1,1
0,1
0,0
--------------
- - 1 1 1
1 - 1 1 *
0 - * * *
1 - 1 1 *
- - 1 1 *
- 1 - - -
- - - 1 *
老规矩,这个算法只是作者自己的理解,可能有地方有问题或者bug(毕竟作者也就是一个老一点的菜鸟),如果有问题,可以留言和私信我,看到都会进行修改,让我们共同进步,一起成长 ^ - ^。
Java 算法之迷宫(简单实现)相关推荐
- 货郎担问题java算法_迷宫最短路径-货郎担问题的解决思路
要解决的问题: 给定一个迷宫,此迷宫中有且仅有一个入口和出口,其中设有若干检查点,要求从入口开始,经过所有检查点后到达出口所需的最短路径.其中路径中允许多次经过入口或出口或某检查点,但路径的开始和结尾 ...
- Java算法--串的简单处理
题目例如以下: 串的处理 在实际的开发工作中.对字符串的处理是最常见的编程任务. 本题目即是要求程序对用户输入的串进行处理.详细规则例如以下: 1. 把每个单词的首字母变为大写. 2. 把数字与字母之 ...
- 【强化学习】Q-Learning算法求解迷宫寻路问题 + Java代码实现
文章目录 前言 一.Q-Learning算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.迷宫寻路问题简介 三.Java代码 3.1 环境说明 3.2 参数配置 3.3 迷宫环境类 ...
- 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)
先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...
- JAVA算法:走迷宫回溯算法设计(JAVA版本)
JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = { {0, 1, 0, 0, 0}, {0, ...
- Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架
Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...
- java十进制转二进制简单算法
Java十进制转二进制简单算法 一.编程思路 可以运用简单的数学的计算的方法.如下 这张图大家应该都不陌生,10(例子中的10)一直除以2,余数写在右面那一列,如果被整除右面写0,如果没有别整除,写他 ...
- 惊!面试现场,简单几道java算法题,90%程序员没写出来
近几个月很多大学实习生离校找实习工作去了,本以为自己很值钱,实际上发现自己并不值钱,想象着自己能赚很多钱了,结果只能拿到一点微薄的工资,很多人会怪公司给的少,但是你有没有想过,你自己的技术值多少钱?你 ...
- 悲哀!面试现场,简单几道java算法题,90%程序员没写出来
这两天小编逛论坛的时候发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们最近想招一批java的实习生,所以他们的面试题并不难,但是前来面试的人,却很多都挂在了几道算法题上,要么就是逻辑不严 ...
最新文章
- 滴滴成立AI Labs 加大人工智能领域投入
- Django学习笔记(5)---ForeignKey
- python教程怎么读_python怎么读二进制文件
- JSR303(Bean Validation 1.0)
- 又是一卦测感情,这卦很是霸气
- 在 C++ 中使用 PPL 进行异步编程
- C# 类的派生 输出个人信息
- python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解
- 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
- 记住密码 的 简要概述_密码错误的简要历史
- 在SpringBoot中优雅的实现定时任务
- 小程序之地图标注以及导航
- 如何拒绝国外IP/屏蔽国外IP访问服务器?
- Flutter中的JSON解析
- 彩灯控制电路设计 -- 流水灯双花型(附Multisim)
- win10家庭中文版自动更新解决办法
- 基于autojs7的皮皮虾极速版辅助
- input选择框样式修改与自定义
- 怎么获得红米手机5 Plus的Root超级权限
- 微信小程序连接mysql
热门文章
- Tpye-C连接外接显示器失效
- Tubi 继续“大小周”!
- 生信小白学习日记Day3——NGS基础 NGS分析注解(质量分析软件)
- Java解方程zu q_关于数学:Java中的微分方程
- matlab中零向量,在MATLAB中的向量中的非零元素之间插入可变数量的零
- python循环语句continue_在Python中嵌套for循环中使用Continue语句
- 微信小程序 airkiss 配网,SmartConfig配网,ap配网教程
- E. Draw a triangle(计算几何+EXGCD)
- ActionBar-Fragment
- js知道顶点和底边中点坐标和长度,求等腰三角形其他两个顶点的坐标