一、介绍
假设迷宫是一个8*7的方形迷宫,红色方块(代码中为1)为墙,通过递归算法使小球从[1,1]的位置开始寻找走出迷宫的路,[6,5]为迷宫出路。
二、代码约定
- map表示地图
- i,j表示从地图的哪个位置开始出发
- 如果小球能到map[6][5]位置,则说明通路找到
- 当map[i][j]为0表示该点没有走过,为1表示墙,为2表示通路可以走,为3表示该点已经走过但是走不通
- 在走迷宫之前,需要确定一个策略(方法): 下->右->上->左,如果该点走不通再回溯
三、代码与运行结果
public class MiGong {
public static void main(String[] args) {
//先创建一个二维数组模拟迷宫
int[][] map = new int[8][7];
//使用1表示墙
//上下左右全部置为1
// System.out.println(map.length);
for(int i = 0; i < 7; i++){
map[0][i] = 1;
map[7][i] = 1;
}
for(int i = 1; i < 7; i++){
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
//输出地图
System.out.println("地图的情况");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
//使用递归回溯给小球找路
setWay(map,1,1);
System.out.println("新地图的情况");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt+" ");
}
System.out.println();
}
}
//使用递归回溯来给小球找路
/**
*
* 约定:
* 1、map表示地图
* 2、i,j表示从地图的哪个位置开始出发
* 3、如果小球能到map[6][5]位置,则说明通路找到
* 4、当map[i][j]为0表示该点没有走过,为1表示墙,为2表示通路可以走,为3表示该点已经走过但是走不通
* 5、在走迷宫之前,需要确定一个策略(方法): 下->右->上->左,如果该点走不通再回溯
*
* @param map 表示地图
* @param i 开始位置
* @param j
* @return true为找到路,false为找不到
*/
public static boolean setWay(int[][] map,int i,int j){
if(map[6][5] == 2){//说明通路已经找到
return true;
}else{
if(map[i][j] == 0){//如果当前的这个点还没有走过
//按照策略走 下->右->上->左
map[i][j] = 2;//假定该点是可以走通的
if(setWay(map,i+1,j)){//向下走
return true;
}else if(setWay(map,i,j+1)){//向右走
return true;
}else if(setWay(map,i-1,j)){//向上走
return true;
}else if(setWay(map,i,j-1)){//向左走
return true;
}else{
//说明该点是走不通的,是死路
map[i][j] = 3;
return false;
}
}else{//如果map[i][j]不等于0,那么就可能是,1|2|3
return false;
}
}
}
}