Java递归·迷宫案例精细分析

递归·迷宫案例
public static void main(String[] args){
	//思路
    //1. 先创建迷宫,用二维数组表示 int[][] map = new int[8][7];
    //2. 先规定 map 数组的元素值: 0 表示可以走 1 表示障碍物
    int[] map[] = new int[8][7];
    //3. 将最上面的一行和最下面的一行,全部设置为1
    for (int i = 0; i < 7; i++) {
        map[0][i] = 1;
        map[7][i] = 1;
    }
    //4.将最右面的一列和最左面的一列,全部设置为1
    for (int i = 0; i < 8; i++) {
        map[i][0] = 1;
        map[i][6] = 1;
    }
    map[3][1] = 1;
    map[3][2] = 1;
    //测试回溯
    map[2][2] = 1;
    //堵死  3
      map[1][2] = 1;
      map[2][1] = 1;
      map[2][2] = 1;
    //输出当前地图
    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[i].length; j++) {
            System.out.print(map[i][j] + " ");//输出一行
        }
        System.out.println();
    }
    //使用findWay找路
    T t = new T();
    t.findWay1(map,1,1);
    //t.findWay2(map,1,1);//改变行径
    System.out.println("\n找到的道路如下:");
    //输出成功地图
    for (int i = 0; i < map.length; i++) {
        for (int j = 0; j < map[i].length; j++) {
            System.out.print(map[i][j] + " ");//输出一行
        }
        System.out.println();
    }
}


class T {
    //使用递归回溯的思想来解决老鼠出迷宫
    //1. findWay方法就是专门来找出迷宫的路径
    //2. 如果找到,就返回 true ,否则返回false
    //3. map 就是二维数组,即表示迷宫
    //4. i,j 就是老鼠的位置,初始化的位置为(1,1)
    //5. 因为我们是递归的找路,所以我先规定 map数组的各个值的含义
    //   0 表示可以走 1 表示障碍物 2 表示可以走 3 表示走过,但是走不通是死路
    //6. 当map[6][5] =2 就说明找到通路,就可以结束,否则就继续找.
    //7. 先确定老鼠找路策略 下->右->上->左
    public boolean findWay1(int[][] map, int i, int j) {
        //出口变量
        int dool = 2;
        
        if (map[6][5] == dool) {//说明已经找到了
            return true;
        } else {
            if (map[i][j] == 0) {//当前这个位置0,说明表示可以走
                //我们假定可以走通
                map[i][j] = dool;
                //使用找路策略,来确定该位置是否真的能走通
                //下->右->上->左
                if (findWay1(map, i + 1, j)) {//先走下
                    return true;
                } else if (findWay1(map, i, j + 1)) {//向右走
                    return true;
                } else if (findWay1(map, i - 1, j)) {//向上走
                    return true;
                } else if (findWay1(map, i, j - 1)) {//向左走
                    return true;
                } else {
                    map[i][j] = 3;
                    return false;
                }
            } else {//map[i][j]=1,2,3
                return false;
            }
        }
    }
    //修改策略,看路径是否有变化
    //上-右-下-左
    public boolean findWay2(int[][] map, int i, int j) {
        if (map[6][5] == 2) {//说明已经找到了
            return true;
        } else {
            if (map[i][j] == 0) {//当前这个位置0,说明表示可以走
                //我们假定可以走通
                map[i][j] = 2;
                //使用找路策略,来确定该位置是否真的能走通
                //下->右->上->左
                if (findWay2(map, i - 1, j)) {//先走上
                    return true;
                } else if (findWay2(map, i, j + 1)) {//向右走
                    return true;
                } else if (findWay2(map, i + 1, j)) {//向下走
                    return true;
                } else if (findWay2(map, i, j - 1)) {//向左走
                    return true;
                } else {
                    map[i][j] = 3;
                    return false;
                }
            } else {//map[i][j]=1,2,3
                return false;
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java归的性能问题通常出现在归深度较大时,因为每一层归都会占用一定的栈空间,而栈空间通常是有限的。为了优化Java归,可以从以下几个方面入手: 1. 尾归优化:将归转换为循环,减少归占用的栈空间。但是Java并不支持尾归优化,需要手动进行转换。 2. 减少归深度:通过改变归算法,减少归深度,从而减少栈空间的占用。例如,可以使用二分查找算法替代顺序查找算法。 3. 增大栈空间:通过设置-Xss参数,增大栈空间的大小,从而允许更深的归深度。例如,可以使用java -Xss4m来设置栈空间大小为4MB。 4. 使用迭代算法:将归算法转换为迭代算法,从而减少栈空间的占用。例如,可以使用循环替代归。 下面是一个归求阶乘的示例代码: ```java public class Factorial { public static int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } } } ``` 可以通过增大栈空间的方式来解决归深度过大的问题,例如: ```java java -Xss4m Factorial ``` 可以通过迭代算法来替代归算法,从而减少栈空间的占用,例如: ```java public class Factorial { public static int factorial(int n) { int result = 1; for (int i = 1; i <= n; i++) { result *= i; } return result; } } ``` 总之,Java归性能优化需要根据具体的情况进行选择,不同的方法适用于不同的场景。这需要对算法进行仔细的分析和优化,以达到最优的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁小ۣۖิ鸽ۣۖิ子ۣۖิ꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值