java 迷宫问题_Java数据结构之栈:回朔法解决迷宫问题

一、概述

迷宫问题:一只老鼠从一个无顶盖的大盒子入口处进入迷宫,经过层层障碍到达唯一的出口处吃到奶酪。

递归与回溯:

1.递归:

若一个对象部分的包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接的或者间接的调用自己,则称这个过程是递归的的过程。由定义可知,递归的应用场景:一是定义是递归的,二是问题的解法是递归的。进而可知,递归问题的求解方法有两种,一是直接求值法;二是不能直接求值,需要回溯的。这两种递归问题都可以转化为非递归问题,其中直接求之法递归问题转化为非递归问题时,可以使用中间变量保存中间结果,相应的这称为直接转化法,另一种递归问题解决方法转换为非递归问题时,需要使用栈来保存中间结果,相应的称为简介转化法。

递归应用例子:

求解斐波那契数列:

public int fib(int n){

if(n<=0){return 0;}

else if(n==1||n==2){return 1;}

else{

return fib(n-1)+fib(n-2);

}

}

使用直接转换法将此问题转化为非递归问题,使用中间变量保存中间结果,从而降低算法时间复杂度,例子如下:

public int fib(int n){

int sum_1 = 1;//保存fib(n-1)的值,初始值为1

int sum_2 = 1;//保存fib(n-2)的值,初始值为1

int sum = 1;

for(int i = 3; i<=n; i++){

sum = sum_1 + sum_2;

sum_2 = sum_1;

sum_1 = sum;

}

return(sum);

}

2.回溯

回溯是一个既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任意一个节点时,总是先判断该结点是否肯定不包含问题的解,如果不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则进入该子树,继续按照深度优先的策略进行搜索。这种以深度优先的方式系统得搜索解的算法称为回溯法。

注意:回溯法求解问题的所有合法解时,要回溯到根结点,且所有子树都已被搜索遍历才结束。但在求解问题的任一解时,只要搜索到问题的一个解就可以结束。

下面使用回溯法分析和解决迷宫问题:

2.1.抽象出迷宫的数据结构

可假设迷宫是一个 mn的二维数组,此时可利用array[m][n]来表示一个迷宫。进而使用array[i][j]=0表示通路,1表示死路。当从某店开始探测时,中间点有八个方向可以试探,设定此迷宫为86的二维数组,则迷宫结构可定义为:

public class maze{

final int m = 8;

final int n = 6;

//盒子边缘的点只有三个试探方向,

//所以加一层之后迷宫上的每一个点将拥有8个试探方向,

//不用额外去判断每个点有几个试探方向

int array[][] = new int[m+2][n+2];

}

2.2.试探方向

你可能感兴趣的:(java,迷宫问题)