迷宫回溯-递归解决

迷宫回溯-递归解决

自用

**题目:**这里有一个迷宫,你需要从绿色方格,走到蓝色方格。不考虑是否为最短路径;

image-20220214153421641

**分析:**我们可以将迷宫看成二维数组;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;
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值