一、简介

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

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

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

 /**
* 回溯法解决,迷宫算法
*
* @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. oracle TBL$OR$IDX$PART$NUM BUG案例处理过程

    通过AWR报告发现数据库cpu告警的问题,定位产生问题的sql语句 首先查看SQL的执行计划 ) FROM cmds.psn_cntr_holder a ,cmds.pol_attrib c ,cmd ...

  2. Redmi Note3 hennessy 刷机过程记录

    本文只是凭记忆,记录大致的步骤,提供线索. 准备 刷机包和supersu刷机包,到xiaomi.eu上下载, 如果是稳定版可能有锁bootloader,需要到下载解锁软件.开发版无锁 刷入recove ...

  3. 被swoole坑哭的PHP程序员

    被swoole坑哭的PHP程序员 2015-09-16 09:57 文帅营 博客园 字号:T | T 首先说一下对swoole的理解:披着PHP外衣的C程序.很多PHPer朋友看到swoole提供的强 ...

  4. <把时间当做朋友>读书笔记

    这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...

  5. js保留两位小数

    js保留两位小数四舍五入: (Math.floor(until_price*100)/100).toFixed(2);//会四舍五入   保留两位小数 且不四舍五入(三种方式,请用最后一种): var ...

  6. 【转】C++格式化输出

    在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进 制形式输出一个 整数,对输出的小数只保留两位小数等.有两种方 ...

  7. echarts基础 handleIcon 设置

    1.自己引入echarts库 2.找到代码中dataZoom中的handleIcon ,看见对应的是"M0,0 v9.7h5 v-9.7h-5 Z",这是由svg画出来的图形,其中 ...

  8. Golang 逐行读写之scanner.Scan

    Go语言实现逐行读的方法多种,本文只介绍Scaner的方法,也是go推荐的方法. 官方文档 例子: file, err := os.Open("filename") if err ...

  9. Css定位之relative_慕课网课程笔记

    前言 最近在慕课网上跟着张鑫旭大神重新学习一遍CSS相关的知识,以下是学习的笔记以及个人一些理解 relative对绝对定位的限制 1.限制绝对定位 绝对定位的top.left.right和botto ...

  10. Leetcode: Find Leaves of Binary Tree

    Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves ...