思路:
说明:
-
小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关
-
再得到小球路径时,可以使用(下右上左)这个策略(策略不止一种)
package com.lzh.recursion;
/**
* 递归解决迷宫问题
*/
public class MiGongQuestion {
public static void main(String[] args) {
//创建一个二维数组,用来当做地图(迷宫)
int[][] map = new int [8][7]; //创建一个8行7列的迷宫
//给迷宫设上墙
//先设置上下方向的墙,一共7列,所以把第一列和最后一列设为1就可以
for (int i = 0; i<7; i++){
map[0][i] = 1;
map[7][i] = 1; //第8行设为1,下标是从1开始算的
}
//设置左右方向的墙,一共是8行,所以第一列和最后一列设为1
for (int i = 0 ; i<8; i++){
map[i][0] = 1;
map[i][6] = 1;
}
//这两个地方也是墙
map[3][1] = 1;
map[3][2] = 1;
//打印出迷宫地图
for(int i = 0; i<8;i++){
for(int j =0; j<7;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//从该位置出发
SearchWay(map,1,1);
for (int i = 0; i<8;i++){
for (int j = 0;j<7;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//递归方法
/**
*
* @param map 迷宫地图
* @param i 从第几行开始出发
* @param j 从第几列开始出发
* @return 找到出口返回true
* 小球在迷宫中行走的一个策略是 下、右、上、左
* 规定 1:表示墙,不能走。2:表示可以走 3:表示这个点走不通
* map[6][5] 这个地方是出口
*/
public static boolean SearchWay(int[][] map,int i,int j){
if (map[6][5] == 2){ //规定这个地方是迷宫出口
return true;
}else{
if (map[i][j] == 0){ //代表这个点不是墙能够从该位置出发
map[i][j] = 2; //假定这个点走的通
if (SearchWay(map, i+1, j)){//先向下走
return true;
}else if (SearchWay(map, i, j+1)){//向右走
return true;
}else if (SearchWay(map, i-1, j)){//向上走
return true;
}else if (SearchWay(map, i, j-1)){//向左走
return true;
}else{
//假如这个点走不通的情况下,map[i][j] 可能是 1、2、3
//这个点走不通 我们就把该点的值设为3
map[i][j] = 3; //递归传的是一个引用类型的数据,所以每次递归都在用的是同一个引用数据,直接修改即可
return false;
}
}else{
//如果这个点不为0,就说明不能从该位置出发,直接返回false就行
return false;
}
}
}
}