Java数据结构之回溯算法的递归应用迷宫的路径问题

一、简介

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

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

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

  1 /**
  2  * 回溯法解决,迷宫算法
  3  *
  4  * @author MIX
  5  *
  6  */
  7 public class MyMaze {
  8
  9     private static int startPosI; // 入口的i下标
 10     private static int startPosJ; // 入口的j下标
 11     private static int endPosI; // 出口的j下标
 12     private static int endPosJ; // 出口的j下标
 13
 14     // 设置迷宫入口的坐标
 15     public void setStart(int startPosI, int startPosJ) {
 16
 17         MyMaze.startPosI = startPosI;
 18         MyMaze.startPosJ = startPosJ;
 19     }
 20
 21     // 设置迷宫出口的坐标
 22     public void setEnd(int endPosI, int endPosJ) {
 23
 24         MyMaze.endPosI = endPosI;
 25         MyMaze.endPosJ = endPosJ;
 26     }
 27
 28     // 迷宫搜索通路的算法
 29     /**
 30      *
 31      * @param cell
 32      *            迷宫地图
 33      * @param i
 34      *            入口的i坐标
 35      * @param j
 36      *            入口的j坐标
 37      */
 38     public static void visited(int[][] cell, int i, int j) {
 39         // 表示此路为通
 40         /*
 41          * 该标记记为走过该路径,一旦该路径为通路且走到了该路径那么就将该位置置为1
 42          */
 43         cell[i][j] = 1;
 44         String oriention = null;
 45         if (i == endPosI && j == endPosJ) { // 找到了出口
 46             System.out.println("找到一条通路");
 47             for (int m = 0; m < cell.length; m++) {
 48                 for (int n = 0; n < cell[i].length; n++) {
 49                     if (cell[m][n] == 2) {
 50                         System.out.print("2");
 51                     } else if (cell[m][n] == 1) {
 52                         System.out.print("*");
 53                     } else {
 54                         System.out.print(" ");
 55                     }
 56                 }
 57                 System.out.println();
 58             }
 59         }
 60
 61         // 向左边寻找通路
 62         if (cell[i][j - 1] == 0) {
 63             oriention = "left";
 64             visited(cell, i, j - 1);
 65         }
 66         // 向右寻找通路
 67         if (cell[i][j + 1] == 0) {
 68             oriention = "right";
 69             visited(cell, i, j + 1);
 70         }
 71         // 向上寻找通路
 72         if (cell[i - 1][j] == 0) {
 73             oriention = "up";
 74             visited(cell, i - 1, j);
 75         }
 76         // 向下寻找通路
 77         if (cell[i + 1][j] == 0) {
 78             oriention = "down";
 79             visited(cell, i + 1, j);
 80         }
 81         /*
 82          * 一旦该路径走到了死胡同里,清理走过的路径将当前位置重新标志为1,推出当前递归的迭代堆栈,返回上一次,继续
 83          * 在当前函数里面的应用主要是清理之前走过的但是被标记为1的位置,将该位置重新置为0,以便下一次的位置可以访问
 84          */
 85         oriention = "无知的我";
 86         cell[i][j] = 0;
 87
 88     }
 89
 90     public static void main(String[] args) {
 91         // 初始化一个迷宫地图
 92         int[][] maze = { { 2, 2, 2, 2, 2, 2, 2, 2, 2 },
 93                 { 2, 0, 0, 0, 0, 0, 0, 0, 2 }, { 2, 0, 2, 2, 0, 2, 2, 0, 2 },
 94                 { 2, 0, 2, 0, 0, 2, 0, 0, 2 }, { 2, 0, 2, 0, 2, 0, 2, 0, 2 },
 95                 { 2, 0, 0, 0, 0, 0, 2, 0, 2 }, { 2, 2, 0, 2, 2, 0, 2, 2, 2 },
 96                 { 2, 0, 0, 0, 0, 0, 0, 0, 2 }, { 2, 2, 2, 2, 2, 2, 2, 2, 2 } };
 97
 98         // MyMaze cell = new MyMaze();
 99         // cell.setStart(1, 1);
100         // cell.setEnd(7, 7);
101         // cell.visited(maze, startPosI, startPosI);
102         int[][] maze2 = { { 2, 2, 2, 2 }, { 2, 0, 0, 2 }, { 2, 0, 0, 2 },
103                 { 2, 2, 2, 2 } };
104         MyMaze cell = new MyMaze();
105         cell.setStart(1, 1);
106         cell.setEnd(2, 2);
107         cell.visited(maze2, startPosI, startPosJ);
108     }
109
110 }

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

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

时间: 2024-10-14 22:34:50

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

数据结构之回溯算法

借鉴:http://blog.csdn.net/baple/article/details/7181404 package database; public class NQuee { public static boolean Verify(int arr[],int i){                              //仅仅判断能不能放置这个皇后        for(int k =1;k != i;k++)                                  

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

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

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

java数据结构与算法之递归思维(让我们更通俗地理解递归)

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53452971 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设计与实现 j

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

1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未执行的操作. 2.贴代码表现: 先序遍历二叉树: BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) retu

数据结构与算法5: 递归(Recursion)

数据结构与算法5: 递归(Recursion) 写在前面 <软件随想录:程序员部落酋长Joel谈软件>一书中<学校只教java的危险性>一章提到,大学计算机系专业课有两个传统的知识点,但许多人从来都没搞懂过,那就是指针和递归.我也很遗憾没能早点熟练掌握这两个知识点.本节一些关键知识点和部分例子,都整理自教材或者网络,参考资料列在末尾.如果错误请纠正我. 思考列表: 1)什么程序具有递归解决的潜质? 2)递归还是非递归算法,怎么选择? 3)递归程序构造的一般模式 1.递归定义 首要引

Java数据结构与算法(第一章综述)

数据结构和算法能起到什么作用? 数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.数据结果包括数组.链表.栈.二叉树.哈希表等等.算法对这些结构中的数据进行各种处理,例如,查找一条特殊的数据项或对数据进行排序. 可用于下面三类情况: 现实数据存储 程序员的工具 建模 数据结构的特性: 数据结构 优点 缺点 数组 插入快,如果知道下标,可以非常快地存取 查找慢,删除慢,大小固定 有序数组 比无序的数组查找快 删除和插入慢,大小固定 栈 提供后进先出的方式存取 存取其他项很慢 队列 提供先

java数据结构与算法之平衡二叉树(AVL树)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53892797 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设