如下是8*7的一个迷宫地图,现在要从左上角标红色数字0走到右下角数字0这个位置,实现自动查找路线。
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
其中1,表示的是墙,是不能触碰的,0表示的是可以走的路线,通过算法,画出从位置(1,1)到(6,5)路线
分析
1,定义一个二维数组,将地图先画出来,墙的位置用1表示,可走的路用0表示
2,自定义一个查找路线 下——>右——>上——>左
3,采用递归算法,一层一层往下走
4,用2表示该点可走,0表示该点未走过,3表示该点是死路
介绍下递归算法
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
本题用的是递归算法,如果首先不弄懂递归算法的话,看懂的话会很复杂。
代码分析
//自定义走的规则 下——>右——>上——>左
public static boolean findWay(int[][] map,int i,int j){
//当走到(6,5)这个位置的时候正好是走到终点,结束
if(map[6][5] == 2){
return true;
}else if(map[i][j] == 0){
map[i][j] = 2;
//向下走
if(findWay(map,i+1,j)){
return true;
}else if(findWay(map,i,j+1)){//向右走
return true;
}else if(findWay(map,i-1,j)){//向上走
return true;
}else if(findWay(map,i,j-1)){//向左走
return true;
}else {
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
这是实现迷宫问题的主要算法,当走到(6,5)这个点时,就表示走到了终点,返回值为true。如果该点为0,表示该点未走过,尝试走下该点,并将他置为2,表示该点已经走过了。该点能通,但是下一步它该怎么走呢?按照我们先开始规定好的路径去走,先往下走,递归调用该方法, 如果往下走的这个点为0, 表示该点能够走通,会继续往下执行,如果往下走不通,将会尝试分别往右,上,左走,能走通则返回true。如果这些点都不能走通,将该点置为3,该点为死路,返回false。
这里是刚好能走到终点,没有出现任何死路的情况,如果是死路的话,该点标记为3之后,然后会回溯到上一个点在进行各个方向去尝试走,如果都不能走通,则上个点也将会被置为3,死路。
完整代码
package cn.mrlij.recursion;
/**
* 迷宫问题
*/
public class MiGong {
public static void main(String[] args) {
//创建一张地图 8行7列,用二维数组表示
int [][] map = new int[8][7];
//用1表示墙
for(int i =0;i < 7; i++){
map[0][i] = 1;
map[7][i] = 1;
}
for(int i =0;i<8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
System.out.println("原始地图~~~");
for(int i = 0;i<8;i++){
for (int j = 0;j<7;j++){
System.out.print(map[i][j]+"\t");
}
System.out.println();
}
System.out.println("走过之后的地图~~~");
findWay(map,1,1);
for(int i = 0;i<8;i++){
for (int j = 0;j<7;j++){
System.out.print(map[i][j]+"\t");
}
System.out.println();
}
}
/**
*走迷宫的方法
* @param //地图
* @param i 行号
* @param j 列号
* @return
*/ //2表示该点可走,0表示该点未走过,3表示该点是死路
// 1 1 1 1 1 1 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 0 0 0 0 0 1
// 1 1 1 1 1 1 1
//自定义走的规则 下——>右——>上——>左
public static boolean findWay(int[][] map,int i,int j){
//当走到(6,5)这个位置的时候正好是走到终点,结束
if(map[6][5] == 2){
return true;
}else if(map[i][j] == 0){
map[i][j] = 2;
//向下走
if(findWay(map,i+1,j)){
return true;
}else if(findWay(map,i,j+1)){//向右走
return true;
}else if(findWay(map,i-1,j)){//向上走
return true;
}else if(findWay(map,i,j-1)){//向下走
return true;
}else {
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
}