一、简介

  回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支;如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止。

  该方法可以使用堆栈实现。也可以使用递归实现,递归实现的话代码比较简单,较难理解建议自己打断点一步步跟踪理解

//=============

 /**
* 回溯法解决,迷宫算法
*
* @author MIX
*
*/
public class MyMaze { private static int startPosI; // 入口的i下标
private static int startPosJ; // 入口的j下标
private static int endPosI; // 出口的j下标
private static int endPosJ; // 出口的j下标 // 设置迷宫入口的坐标
public void setStart(int startPosI, int startPosJ) { MyMaze.startPosI = startPosI;
MyMaze.startPosJ = startPosJ;
} // 设置迷宫出口的坐标
public void setEnd(int endPosI, int endPosJ) { MyMaze.endPosI = endPosI;
MyMaze.endPosJ = endPosJ;
} // 迷宫搜索通路的算法
/**
*
* @param cell
* 迷宫地图
* @param i
* 入口的i坐标
* @param j
* 入口的j坐标
*/
public static void visited(int[][] cell, int i, int j) {
// 表示此路为通
/*
* 该标记记为走过该路径,一旦该路径为通路且走到了该路径那么就将该位置置为1
*/
cell[i][j] = 1;
String oriention = null;
if (i == endPosI && j == endPosJ) { // 找到了出口
System.out.println("找到一条通路");
for (int m = 0; m < cell.length; m++) {
for (int n = 0; n < cell[i].length; n++) {
if (cell[m][n] == 2) {
System.out.print("2");
} else if (cell[m][n] == 1) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
} // 向左边寻找通路
if (cell[i][j - 1] == 0) {
oriention = "left";
visited(cell, i, j - 1);
}
// 向右寻找通路
if (cell[i][j + 1] == 0) {
oriention = "right";
visited(cell, i, j + 1);
}
// 向上寻找通路
if (cell[i - 1][j] == 0) {
oriention = "up";
visited(cell, i - 1, j);
}
// 向下寻找通路
if (cell[i + 1][j] == 0) {
oriention = "down";
visited(cell, i + 1, j);
}
/*
* 一旦该路径走到了死胡同里,清理走过的路径将当前位置重新标志为1,推出当前递归的迭代堆栈,返回上一次,继续
* 在当前函数里面的应用主要是清理之前走过的但是被标记为1的位置,将该位置重新置为0,以便下一次的位置可以访问
*/
oriention = "无知的我";
cell[i][j] = 0; } public static void main(String[] args) {
// 初始化一个迷宫地图
int[][] maze = { { 2, 2, 2, 2, 2, 2, 2, 2, 2 },
{ 2, 0, 0, 0, 0, 0, 0, 0, 2 }, { 2, 0, 2, 2, 0, 2, 2, 0, 2 },
{ 2, 0, 2, 0, 0, 2, 0, 0, 2 }, { 2, 0, 2, 0, 2, 0, 2, 0, 2 },
{ 2, 0, 0, 0, 0, 0, 2, 0, 2 }, { 2, 2, 0, 2, 2, 0, 2, 2, 2 },
{ 2, 0, 0, 0, 0, 0, 0, 0, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2 } }; // MyMaze cell = new MyMaze();
// cell.setStart(1, 1);
// cell.setEnd(7, 7);
// cell.visited(maze, startPosI, startPosI);
int[][] maze2 = { { 2, 2, 2, 2 }, { 2, 0, 0, 2 }, { 2, 0, 0, 2 },
{ 2, 2, 2, 2 } };
MyMaze cell = new MyMaze();
cell.setStart(1, 1);
cell.setEnd(2, 2);
cell.visited(maze2, startPosI, startPosJ);
} }

//上面代码里面的测试代码我是用了一个比较简单的4*4矩阵进行测试,方便断点观察,理解该算法的思路。

//这里其实和递归方法的方法栈应用有点类似。

Java数据结构之回溯算法的递归应用迷宫的路径问题的更多相关文章

  1. Java实现 蓝桥杯 算法提高 学霸的迷宫

    算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...

  2. Java实现 蓝桥杯 算法训练 递归求二项式系数

    算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB 问题描述 样例输入 一个满足题目要求的输入范例. 3 10 样例输出 与上面的样例输入对应的输出. 数据规模和约定 ...

  3. Java数据结构与排序算法——堆和堆排序

    //================================================= // File Name : Heap_demo //--------------------- ...

  4. java实现回溯算法

    最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结. 什么叫做回溯算法 (摘抄于百度百科) 回溯算法实际上一个类似枚举的 ...

  5. Java中的数据结构及排序算法

    (明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...

  6. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  7. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  8. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

  9. c语言数据结构:递归的替代-------回溯算法

    1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...

随机推荐

  1. 【iCore3双核心板】发布 iCore3 应用开发平台用户手册

    PDF手册下载地址:http://pan.baidu.com/s/1miBBYi8 iCore3应用开发平台购买地址:https://item.taobao.com/item.htm?spm=a1z1 ...

  2. 本周psp

      本周PSP 类别 内容 开始时间 中止时间 终止时间 总用时 产品计划会议 定义产品的用户需求,以及从这个产品中得到什么.解决啥问题 18:00 0 20:00 120分钟 撰写博客 会议记录与个 ...

  3. Vue.js起手式+Vue小作品实战

    本文是小羊根据Vue.js文档进行解读的第一篇文章,主要内容涵盖Vue.js的基础部分的知识的,文章顺序基本按照官方文档的顺序,每个知识点现附上代码,然后根据代码给予个人的一些理解,最后还放上在线编辑 ...

  4. google protobuf初体验

    最近在读别人代码的时候发现一个的东西,名字叫protobuf, 感觉挺好用的,写在这里,留个记录.那么什么是protobuf 呢?假如您在网上搜索,应该会得到类似这样的文字介绍: Google Pro ...

  5. 【php】命名空间 和 自动加载的关系

    目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...

  6. Visual Studio 2013中因Browser Link引起的Javascript错误

    参考文章:http://www.cnblogs.com/daxnet/archive/2013/10/27/3391146.html Browser Link功能会引起js异常.在调试右侧的三角下拉选 ...

  7. PDO和消息队列的一点个人理解

    什么是消息队列,百度百科说,···消息队列····是在消息的传输过程中保存消息的容器. 看着网上林林总总的文章,都说是为了应对高并发,处理数据量超级大的一种数据容器,也可以说是利用各种方式,先把数据存 ...

  8. js 简易的分页器插件

    1.自己引入jquery插件,我的demo是引入的自己本地的query <!DOCTYPE html> <html> <head> <meta charset ...

  9. 原生js拖拽

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. CallBack实践。

    第一:它的应用场景是什么? if you call me ,i will call back.目前我接触到两种需要回调的需求 1.系统管理平台登录,登录所需要的人员和部门数据都是在另一个基础信息系统中 ...