以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计程序,对随意设定的迷宫,求出从入口到出口的全部通路。

以下我们来具体讲一下迷宫问题的回溯算法。

该图是一个迷宫的图。1代表是墙不能走,0是能够走的路线。仅仅能往上下左右走。直到从左上角到右下角出口。

做法是用一个二维数组来定义迷宫的初始状态,然后从左上角開始。不停的去试探全部可行的路线,碰到1就结束本次路径。然后探索其它的方向,当然我们要标记一下已经走的路线。不能重复的在两个可行的格子之间来回走。直到走到出口为止。算找到了一个正确路径。

程序例如以下,详细做法看凝视就可以。

package huisu;/*** Created by wolf on 2016/3/21.*/
public class MiGong {/*** 定义迷宫数组*/private int[][] array = {{0, 0, 1, 0, 0, 0, 1, 0},{0, 0, 1, 0, 0, 0, 1, 0},{0, 0, 1, 0, 1, 1, 0, 1},{0, 1, 1, 1, 0, 0, 1, 0},{0, 0, 0, 1, 0, 0, 0, 0},{0, 1, 0, 0, 0, 1, 0, 1},{0, 1, 1, 1, 1, 0, 0, 1},{1, 1, 0, 0, 0, 1, 0, 1},{1, 1, 0, 0, 0, 0, 0, 0}};private int maxLine = 8;private int maxRow = 9;public static void main(String[] args) {System.out.println(System.currentTimeMillis());new MiGong().check(0, 0);System.out.println(System.currentTimeMillis());}private void check(int i, int j) {//假设到达右下角出口if (i == maxRow - 1 && j == maxLine - 1) {print();return;}//向右走if (canMove(i, j, i, j + 1)) {array[i][j] = 5;check(i, j + 1);array[i][j] = 0;}//向左走if (canMove(i, j, i, j - 1)) {array[i][j] = 5;check(i, j - 1);array[i][j] = 0;}//向下走if (canMove(i, j, i + 1, j)) {array[i][j] = 5;check(i + 1, j);array[i][j] = 0;}//向上走if (canMove(i, j, i - 1, j)) {array[i][j] = 5;check(i - 1, j);array[i][j] = 0;}}private boolean canMove(int i, int j, int targetI, int targetJ) {
//        System.out.println("从第" + (i + 1) + "行第" + (j + 1) + "列。走到第" + (targetI + 1) + "行第" + (targetJ + 1) + "列");if (targetI < 0 || targetJ < 0 || targetI >= maxRow || targetJ >= maxLine) {
//            System.out.println("到达最左边或最右边,失败了");return false;}if (array[targetI][targetJ] == 1) {
//            System.out.println("目标是墙,失败了");return false;}//避免在两个空格间来回走if (array[targetI][targetJ] == 5) {
//            System.out.println("来回走。失败了");return false;}return true;}private void print() {System.out.println("得到一个解:");for (int i = 0; i < maxRow; i++) {for (int j = 0; j < maxLine; j++) {System.out.print(array[i][j] + " ");}System.out.println();}}
}

我把打印每一步路径推断的地方凝视掉了,放开凝视就能看到全部走的路径。
    程序运行效率是很快,基本上是在3ms之内得到全部路径。

原本仅仅看图时我还以为仅仅有3条路径,没想到程序打出来了8条。

后来细致看看。果然是有8条路径……

打印结果例如以下,5是用来标记路径的:

1458551044499
得到一个解:
5 5 1 0 0 0 1 0
5 5 1 0 0 0 1 0
5 0 1 0 1 1 0 1
5 1 1 1 0 0 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 5 1 0 0 0 1 0
5 5 1 0 0 0 1 0
5 0 1 0 1 1 0 1
5 1 1 1 5 5 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 5 1 0 0 0 1 0
0 5 1 0 0 0 1 0
5 5 1 0 1 1 0 1
5 1 1 1 0 0 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 5 1 0 0 0 1 0
0 5 1 0 0 0 1 0
5 5 1 0 1 1 0 1
5 1 1 1 5 5 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 0 1 0 0 0 1 0
5 5 1 0 0 0 1 0
5 5 1 0 1 1 0 1
5 1 1 1 0 0 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 0 1 0 0 0 1 0
5 5 1 0 0 0 1 0
5 5 1 0 1 1 0 1
5 1 1 1 5 5 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 0 1 0 0 0 1 0
5 0 1 0 0 0 1 0
5 0 1 0 1 1 0 1
5 1 1 1 0 0 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
得到一个解:
5 0 1 0 0 0 1 0
5 0 1 0 0 0 1 0
5 0 1 0 1 1 0 1
5 1 1 1 5 5 1 0
5 5 5 1 5 5 5 0
0 1 5 5 5 1 5 1
0 1 1 1 1 0 5 1
1 1 0 0 0 1 5 1
1 1 0 0 0 0 5 0
1458551044503

转载于:https://www.cnblogs.com/jzdwajue/p/7145855.html

回溯算法解迷宫问题(java版)相关推荐

  1. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  2. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  3. 算法--猫扑素数--java版

    算法–猫扑素数–java版 简介 猫扑素数: 形如以 2 开头, 之后跟任意多个 3 的十进制整数如果是个素数, 则它是猫扑素数. 如 2, 23, 233, 2333, 23333 都是猫扑素数, ...

  4. 回溯算法解数独问题(java版)

    下面来详细讲一下如何用回溯算法来解数独问题. 下图是一个数独题,也是号称世界上最难的数独.当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累.回溯算法基本上就是穷举,解这种 ...

  5. 回溯算法解决迷宫问题

    文章目录 前言 一.回溯法 二.算法应用--迷宫问题 1.问题描述 2.解题思路 三.Java代码实现 前言 本文介绍一种经典算法--回溯法,可作为迷宫问题的一种解法. 一.回溯法 回溯是一种算法思想 ...

  6. 回溯算法解子集、组合、排序

    转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...

  7. 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)

    SnowFlake 雪花算法 对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入 ...

  8. 一个点是否在矩形内的算法_478,回溯算法解单词搜索

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答. 问题描述 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序 ...

  9. [人工智能]回溯算法解数独

    今天在AI课上学了CSP,然后学了回溯算法.所以就用回溯算法来解数独吧. 数独问题可以把九九八十一个格简化为81个变量,每一个变量可以取1-9的值,当然,一开始初始化的值是不可以改变的.然后呢,对于这 ...

  10. C语言学习日记(12)——回溯法解迷宫(1)

    走迷宫是一种经典的智力游戏,相信很多人都玩过.我们走迷宫的过程一般是这样的:从入口开始尝试,如果走到某个位置有几种方案可以选择,则选择其中的一种方案进行尝试,不断重复这个过程.如果走不通,就回退到前一 ...

最新文章

  1. PHP导入excel到mysql数据库完整代码附效果图
  2. RecycleView的notifyItemRemoved使用注意
  3. matlab 图像分割 提取人像_几种典型的图像处理技术(分类 目标提取 目标跟踪 语义分割 实例分割)...
  4. SpringMvc入门教程
  5. activeMQ使用总结
  6. Asp.net core中Migration工具使用的交流分享
  7. 关于@property的一些用法
  8. 物联网通信之Coap 协议
  9. 匿名类 java final_java提高篇(十)-----详解匿名内部类 ,形参为什么要用final
  10. sqlisnull mysql_SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
  11. Silverlight客户端和WCF服务器端共享类库
  12. Axure RP 9.0 软件安装教程
  13. 基于经纬度做航线图可视化
  14. 《数据库实验》实验五:数据库编程
  15. vscode无法更改文件夹名称
  16. java实现阳历农历节以及节假日日期计算
  17. 张江男曲折的出国梦_IT新闻_博客园
  18. 地下管孔资源紧张,气吹微缆不香吗?
  19. 定时器之计时(时间的转换)
  20. Samba文件服务器的配置

热门文章

  1. 【渝粤教育】电大中专学前儿童科学教育 (2)作业 题库
  2. 【Python实例第29讲】递归的特征排除法
  3. 求解偏微分方程开源有限元软件deal.II学习--Step 37
  4. java 实现类似spring的可配置的AOP框架
  5. Linux系统基础开发应用及Linux-C用户手册
  6. iOS-----------关于UDID
  7. 1、和一定时找数组中的两个数
  8. 几个例子弄懂JS 的setInterval的运行方式
  9. [转]java applet
  10. js 去除html标签