递归之迷宫问题

用递归来解决迷宫问题

递归,可以将复杂的问题简单化,一个比较好的用法是用来解决走迷宫问题。
现在首先要创建一个迷宫,

final int[][] ints = new int[6][8];
        for (int i = 0; i < 8; i++) {
            ints[0][i] = 1;
            ints[5][i] = 1;
        }
        for (int i = 0; i < 6; i++) {
            ints[i][0] = 1;
            ints[i][7] = 1;
        }
        ints[3][1] = 1;
        ints[3][2] = 1;
        ints[3][3] = 1;
        ints[3][4] = 1;

        for (int i = 0; i < 6; i++) {
            for(int j = 0; j < 8; j++){
                System.out.print(ints[i][j]);
            }
            System.out.println();
        }

输出结果为:
在这里插入图片描述
现在写一个方法来进行走迷宫,代码如下:

/**
     * 假设从(1,1)开始走
     * 0,代表没走过,1,代表是墙 2,代表走过可以走通,3,代表走过不可以走通
     * @param ints 这个ints代表的是围墙
     * @param i i,j代表的是起点
     * @param j
     * @return
     */
    public static boolean setWay(int[][] ints, int i, int j){
        //假设终点是ints[4][1]
        if(ints[4][1] == 2){
            return true;
        }else if(ints[i][j] == 0){
            //假设可以走通
            ints[i][j] = 2;
            //如果向下走一步可以到达则返回true
            if(setWay(ints,i+1,j)){
                return true;
                //如果向右走一步可以到达则返回true
            }else if(setWay(ints,i,j+1)){
                return true;
            }else if(setWay(ints,i-1,j)){
                return true;
            }else if(setWay(ints,i,j-1)){
                return true;
            }//如果下、右、上、左都走不通的话,那说明这个点肯定走不同了
            else{
                ints[i][j] = 3;
                return false;
            }
        }else {
            return false;
        }

    }

结果如下:
在这里插入图片描述
对这个2进行分析,当走到这里的时候,根据规则,他是先像上走一直走到最后一个,发现没地方可以走了,只能在执行ints[i][j] = 3,return false,此时,之前的setWay方法收到的是false,所以,也赋值3 返回false,直到方框中的2,这时候

//向右边走
else if(setWay(ints,i,j+1)){
                return true;
            }

可以确定向右边走是失败的,已经返回false,但是它左边的

//向左边走
else if(setWay(ints,i,j-1)){
                return true;
            }

左边的setWay(ints,i,j-1)这个判断语句还不知大返回什么,故开始向左边走。直到找到了目标位置。
这个迷宫问题走法是作者给的,如果要求最短路径的话,需要把各种走法的步数求取出来,看哪一个最小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值