迷宫回溯-递归解决
自用
**题目:**这里有一个迷宫,你需要从绿色方格,走到蓝色方格。不考虑是否为最短路径;
**分析:**我们可以将迷宫看成二维数组;1就是代表墙,空白区域代表0。接下来使用递归来解决。跟着下面的思路来。
我的代码规则:某个点位如果是0,则代表没走过,1则是墙,2则是可以通过,3则是不能通
1 1 1 1 1 1 1
1 1
1 1
1 1 1 1
1 1
1 1
1 1
1 1 1 1 1 1 1
//首先创建一个二维数组。并且将二维数组打印成以上模样。空白区域是零,默认为零,所以不管空白区域。只需要剑1打出来就行了。
//一下为打印出迷宫地图的代码
public class 迷宫回溯 {
public static void main(String[] args) {
//先创建一个二维数组,来模拟迷宫
//创建地图 map
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 = 1; i < 7; i++) {
map[i][0]=1;
map[i][6]=1;
}
//把凸出来的墙置为一
for (int i = 1; i <3; i++) {
map[3][i]=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();
}
}
//这里开始用来实现,通过递归实现小球找路的功能
/*
使用递归回溯,给小球找路
说明:
1-map 表示地图
2-i,j表示从地图的哪个位置开始出发(1,1)
3-如果小球能到map[6][5]位置,则说明,通过了
4-约定:当map[i][j]为0表示该点没有走过,1,表示墙,2表示通路可以走,3表示已经走过,但是走不通
5-再走迷宫时,需要确定一个方法(策略),下-》右-》上-》左。如果该点走不通,在回溯
*/
/**
*
* @param map 表示地图
* @param i 表示从哪个点开始走
* @param j
* @return 如果找到通路,就返回true ,否则就返回,false
*/
下面的代码,代入此处
}
//创建一个方法setWay()
//我们根据上面地图可以发现数组[6][5] 就是迷宫的出口,所以我们只需要到达这里,就结束了
//这个方法的参数各自代表的意思在上面的49行。i,j是我们自己输入的,也就是我们输入哪个点就在哪个点出发。
public static boolean setWay(int[][]map,int i ,int j) {
if(map[6][5]==2) { //通路已经找到,为什么找到了?因为2到了出口了,自然就找到了。但是我们一般不会让出发点就是终点,所以此处只是判断一下而已。
return true;
}else{
//先看这个注释看完第一部分再去看代码。看完代码再把剩下的看完。
/*
1 1 1 1 1 1 1
1 1
1 1
1 1 1 1
1 1
1 1
1 1
1 1 1 1 1 1 1
这里开始使用到递归,首先,从1,1 这个开始走,判断,是否为0.从上图中可以很明显的判断出是0.
所以我们让他赋值2,为什么给他2,因为他是0,0就是没有走过,我现在到这里来,我先给他2
如果下面的判断是成立的,那么这个2不变,如果是不成立的,则赋值3给他,3就是走不通的意思。
开始判断,下,成立不?自行代入,你会发现成立。所以2,1这个点位也变成2.因为递归,他又回到这里将他变成2。
1 1 1 1 1 1 1
1 2 1
1 2 1
1 1 1 1
1 1
1 1
1 1
1 1 1 1 1 1 1
递归回到这里第一次,2,1。下,你会发现不成立,所以向右,发现成立,所以执行右的代码,
1 1 1 1 1 1 1
1 2 1
1 2 2 1
1 1 1 1
1 1
1 1
1 1
1 1 1 1 1 1 1
然后就是这样,以此类推,最终结果就是这样。这个0我们可以不管他
因为空数组的默认值是0。上面的代码打印出来也有0,只是我没(手动)打出来
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1
*/
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;
}
}
}