最近在学习算法,又又看到了一个挺有趣的题目,就是走迷宫,就写了一篇简单实现走迷宫的算法,就只是找到一条出路,你问为啥不写复杂一点,因为作者想留给你们写(就是懒得考虑那么多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 算法之迷宫(简单实现)相关推荐

  1. 货郎担问题java算法_迷宫最短路径-货郎担问题的解决思路

    要解决的问题: 给定一个迷宫,此迷宫中有且仅有一个入口和出口,其中设有若干检查点,要求从入口开始,经过所有检查点后到达出口所需的最短路径.其中路径中允许多次经过入口或出口或某检查点,但路径的开始和结尾 ...

  2. Java算法--串的简单处理

    题目例如以下: 串的处理 在实际的开发工作中.对字符串的处理是最常见的编程任务. 本题目即是要求程序对用户输入的串进行处理.详细规则例如以下: 1. 把每个单词的首字母变为大写. 2. 把数字与字母之 ...

  3. 【强化学习】Q-Learning算法求解迷宫寻路问题 + Java代码实现

    文章目录 前言 一.Q-Learning算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.迷宫寻路问题简介 三.Java代码 3.1 环境说明 3.2 参数配置 3.3 迷宫环境类 ...

  4. 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)

    先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...

  5. JAVA算法:走迷宫回溯算法设计(JAVA版本)

    JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = {                 {0, 1, 0, 0, 0},                 {0, ...

  6. Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系 java实现基于用户的协同过滤推荐算法 源代码下载 算法实现 Spring+Struts+Hibernate(SSH)开发框架

    Java+Jsp+Mysql实现简单在线图书推荐系统 个性化图书推荐系统(基于用户的协同过滤推荐算法) 一.项目简介 1.开发工具和实现技术 MyEclipse10,jdk1.7,mysql5.5,t ...

  7. java十进制转二进制简单算法

    Java十进制转二进制简单算法 一.编程思路 可以运用简单的数学的计算的方法.如下 这张图大家应该都不陌生,10(例子中的10)一直除以2,余数写在右面那一列,如果被整除右面写0,如果没有别整除,写他 ...

  8. 惊!面试现场,简单几道java算法题,90%程序员没写出来

    近几个月很多大学实习生离校找实习工作去了,本以为自己很值钱,实际上发现自己并不值钱,想象着自己能赚很多钱了,结果只能拿到一点微薄的工资,很多人会怪公司给的少,但是你有没有想过,你自己的技术值多少钱?你 ...

  9. 悲哀!面试现场,简单几道java算法题,90%程序员没写出来

    这两天小编逛论坛的时候发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们最近想招一批java的实习生,所以他们的面试题并不难,但是前来面试的人,却很多都挂在了几道算法题上,要么就是逻辑不严 ...

最新文章

  1. 滴滴成立AI Labs 加大人工智能领域投入
  2. Django学习笔记(5)---ForeignKey
  3. python教程怎么读_python怎么读二进制文件
  4. JSR303(Bean Validation 1.0)
  5. 又是一卦测感情,这卦很是霸气
  6. 在 C++ 中使用 PPL 进行异步编程
  7. C# 类的派生 输出个人信息
  8. python中深拷贝和浅拷贝_**Python中的深拷贝和浅拷贝详解
  9. 127_Power PivotPower BI DAX计算订单商品在库时间(延伸订单仓储费用)
  10. 记住密码 的 简要概述_密码错误的简要历史
  11. 在SpringBoot中优雅的实现定时任务
  12. 小程序之地图标注以及导航
  13. 如何拒绝国外IP/屏蔽国外IP访问服务器?
  14. Flutter中的JSON解析
  15. 彩灯控制电路设计 -- 流水灯双花型(附Multisim)
  16. win10家庭中文版自动更新解决办法
  17. 基于autojs7的皮皮虾极速版辅助
  18. input选择框样式修改与自定义
  19. 怎么获得红米手机5 Plus的Root超级权限
  20. 微信小程序连接mysql

热门文章

  1. Tpye-C连接外接显示器失效
  2. Tubi 继续“大小周”!
  3. 生信小白学习日记Day3——NGS基础 NGS分析注解(质量分析软件)
  4. Java解方程zu q_关于数学:Java中的微分方程
  5. matlab中零向量,在MATLAB中的向量中的非零元素之间插入可变数量的零
  6. python循环语句continue_在Python中嵌套for循环中使用Continue语句
  7. 微信小程序 airkiss 配网,SmartConfig配网,ap配网教程
  8. E. Draw a triangle(计算几何+EXGCD)
  9. ActionBar-Fragment
  10. js知道顶点和底边中点坐标和长度,求等腰三角形其他两个顶点的坐标