这里以8*7的宫格为例,代码实现如下:
package com.atguigu.recursion;
public class MiGong {
public static void main(String[] args) {
//先创建一个二维数组,模拟迷宫
//地图
int[][] map=new int[8][7];
//使用1表示墙
//上下全部置为1
for(int i=0;i<7;i++) {
map[0][i]=1;
map[7][i]=1;
}
//左右全部置为1
for(int i=0;i<8;++i) {
map[i][0]=1;
map[i][6]=1;
}
//设置挡板,1表示
map[3][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]+" ");
}
System.out.println();
}
//使用递归回溯给小球找路
setWay(map, 1, 1);
//输出新的地图,小球走过,并标识过的地图
System.out.println("小球走过,并标识过的地图:");
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.如果小球可以到达map[6][5]则说明通路找到
* 2.约定:当map[i][j]=0时表示该点每走过,当为1时表示墙,2表示
* 通路可以走,3表示该位置已经走过,但是走不通
* 3.在走迷宫时的策略:先下->右->上->左,如果该点走不通再回溯
*/
//使用递归回溯来给小球找路
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;
}
}
}
}