Java数据结构之回溯算法的递归应用迷宫的路径问题
一、简介
回溯法的基本思想是:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支;如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止。
该方法可以使用堆栈实现。也可以使用递归实现,递归实现的话代码比较简单,较难理解建议自己打断点一步步跟踪理解
//=============
/**
* 回溯法解决,迷宫算法
*
* @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数据结构之回溯算法的递归应用迷宫的路径问题的更多相关文章
- Java实现 蓝桥杯 算法提高 学霸的迷宫
算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二 ...
- Java实现 蓝桥杯 算法训练 递归求二项式系数
算法训练 6-1 递归求二项式系数值 时间限制:10.0s 内存限制:256.0MB 问题描述 样例输入 一个满足题目要求的输入范例. 3 10 样例输出 与上面的样例输入对应的输出. 数据规模和约定 ...
- Java数据结构与排序算法——堆和堆排序
//================================================= // File Name : Heap_demo //--------------------- ...
- java实现回溯算法
最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结. 什么叫做回溯算法 (摘抄于百度百科) 回溯算法实际上一个类似枚举的 ...
- Java中的数据结构及排序算法
(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- Java数据结构和算法 - 递归
三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...
- c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
随机推荐
- IConfigurationSectionHandler 使用~
读取webconfig中自定义的xml 处理对特定的配置节的访问. webconfig <configSections> <section name="NopConfig ...
- AutoIt操作Windows GUI实现文件上传
AutoIt 一个使用类似BASIC脚本语言的免费软件,用于Windows GUI(图形用户界面)中进行自动化操作.它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务. 官方网站: htt ...
- The MESI Protocol
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION To provide cache cons ...
- sqlite数据库相关总结
1. sqlite是轻量型.关系型管理系统,是嵌入式的,占用资源低.可移植性强,比mySql处理速度快,现在主流的版本是sqlite3 2. sqlite中的数据类型有TEXT(字符串,采用UTF-8 ...
- Linux基本操作命令
Linux基本操作命令 首先介绍一个名词“控制台(console)”,它就是我们通常见到的使用字符操作界面的人机接口,例如dos.我们说控制台命令,就是指通过字符界面输入的可以操作系统的命令,例如do ...
- alert样式修改
HTML: <div id="div">1223325</div> CSS: .btn_alert button{font-size: 1em;border ...
- mac os 下的sublime --- 快捷键
mac os 下的sublime ---列模式 http://www.oschina.net/question/249672_161413 触控板也可以的:左手同时按住 Option 和触控板左下角 ...
- zx一篇让Java程序猿随时可以翻看的Oracle总结
一篇让Java程序猿随时可以翻看的Oracle总结 前言:Oracle学习也有十几天了,但是呢,接下来还要学习许多其他的东西,并不能提步不前,所以在此总结了以下Oracle中常用的命令和语句,没有语法 ...
- nvm诡异的报错
安装:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash wget -qO- htt ...
- android 中获取当前焦点所在屏幕中的位置 view.getLocationOnScreen(location)
final int[] location = new int[2]; view.getLocationOnScreen(location); final int[] location = new in ...