07-递归-迷宫

作者: 紫荆秋雪_文 | 来源:发表于2022-06-23 15:41 被阅读0次

铭记:

\color{#DC143C}{算法 + 数据结构 = 程序}

源码下载

一、迷宫问题

  • 从黄色圆圈开始出发,走到红色⭕️表示走出迷宫
  • 数字0:表示该位置没有走过,可以走
  • 数字1:表示墙或者障碍物,不可走
  • 数字2:表示该位置已走过,可以走通
  • 数字3:表示该位置已走过,但是走不通
迷宫问题.png

1、解决迷宫问题的思路

  • 走迷宫的原则:按照 下 —— 右 —— 上 —— 左 的规则来行走
  • (1, 1) 值为0,表示没有走过,可以走并且设置(1, 1) = 2;按照规则应该向下走
  • (1, 2)值为0,表示没有走过,可以走并且设置(1, 2) = 2;按照规则应该向下走
  • (1, 3)值为1,这是障碍物,不能走,所以要不能继续向下,需要向右走
  • (2, 2)值为0,表示没有走过,可以走并且设置(2, 2) = 2;按照规则应该向下走
  • (2, 3)值为1,这是障碍物,不能走,所以要不能继续向下,需要向右走
  • (3, 2)值为0,表示没有走过,可以走并且设置(3, 2) = 2;按照规则应该向下走
  • 。。。
  • 通过分析可以得出结论
    • 1、只有当前位置的值为0时,首先要把该位置值设置为2,再按照规则继续走
    • 2、当按照规则走时,向下走不通是,再试向右走,如果向右走不通,再向上走,如果向上走不通再向左走,如果左也走不通。表示该位置(2)不能走,所以需要回退(3)

代码 Migong

package com.raven.alg.s5recursion;

/**
 * 0:可以走的路
 * 1:代表墙
 * 2:走过的路
 * 3:回退的路
 * 迷宫
 */
public class Migong {

    public static void run(Integer size, int startX, int startY, int endX, int endY) {
        if (size < 1) {
            throw new RuntimeException("迷宫不能小于0");
        }
        // 1、创建迷宫
        int[][] mg = initMigong(size);
        // 迷宫围墙
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                System.out.print(mg[i][j] + " ");
            }
            System.out.println();
        }

        // 2、走迷宫
        go(mg, startX, startY, endX, endY);
    }


    /**
     * 初始化迷宫
     * <p>
     * 0:未走过,可以走的路
     * 1:代表墙
     * 2:走过的路,可以走得通
     * 3:走过的路,但是走不通
     * <p>
     * 规则:下->右->上->左
     *
     * @param mg     迷宫
     * @param startX 开始的x位置
     * @param startY 开始的y位置
     * @param endX   结束的x位置
     * @param endY   结束的y位置
     */
    private static Boolean go(int[][] mg, int startX, int startY, int endX, int endY) {
        System.out.println("=====开始走迷宫====");
        for (int i = 0; i < mg.length; i++) {
            for (int j = 0; j < mg.length; j++) {
                System.out.print(mg[i][j] + " ");
            }
            System.out.println();
        }
        // 代表找到出口
        if (2 == mg[endX][endY]) {
            return true;
        } else {
            // 该路没有走过
            if (0 == mg[startX][startY]) {
                mg[startX][startY] = 2;
                // 规则:下->右->上->左
                if (go(mg, startX + 1, startY, endX, endY)) {
                    return true;
                } else if (go(mg, startX, startY + 1, endX, endY)) {
                    return true;
                } else if (go(mg, startX - 1, startY, endX, endY)) {
                    return true;
                } else if (go(mg, startX, startY - 1, endX, endY)) {
                    return true;
                } else {
                    // 回溯,把 2->3
                    mg[startX][startY] = 3;
                    return false;
                }
            } else {
                return false;
            }
        }
    }

    /**
     * 初始化迷宫
     *
     * @param size
     * @return
     */
    private static int[][] initMigong(Integer size) {
        if (size < 1) {
            throw new RuntimeException("迷宫不能小于0");
        }
        // 创建迷宫
        int[][] mg = new int[size][size];
        // 迷宫围墙
        // 1、上下墙
        for (int i = 0; i < size; i++) {
            mg[0][i] = 1;
//            mg[3][i] = 1;
            mg[size - 1][i] = 1;
        }
        // 2、左右墙
        for (int i = 0; i < size; i++) {
            mg[i][0] = 1;
            mg[i][size - 1] = 1;
        }

        // 3、中间障碍
        mg[3][1] = 1;
        mg[3][2] = 1;
        mg[3][3] = 1;

        return mg;
    }

}

测试类RecursionDemo

package com.raven.alg.s5recursion;


import java.math.BigDecimal;

public class RecursionDemo {

    public static void main(String[] args) {
//        BigDecimal factorial = Recursion.factorial(20);
//        System.out.println("factorial = " + factorial);

//        Migong.run(10, 8, 8, 1, 1);
        Migong.run(10, 1, 1, 8, 8);
    }
}

相关文章

  • 07-递归-迷宫

    铭记: 源码下载[https://github.com/zjqx1991/alg] 一、迷宫问题 从黄色圆圈开始出...

  • 递归求解迷宫

    效果图 结果图 完整代码

  • 递归解迷宫问题

    递归程序需要向退出条件逼近,否则就会形成死递归 递归在方法结束或者遇到return时返回给调用者 使用递归解迷宫问...

  • python迷宫游戏,迷宫生成,解决与可视化

    代码已上传github 使用prime算法生成迷宫使用递归算法走迷宫使用pygame做可视化展示 prime算法生...

  • 算法-迷宫问题(递归)

    迷宫问题:之前只用栈来实现,现在使用递归来实现。blog.csdn.net/feixiaoxing/article...

  • 递归之迷宫问题

    1.什么是递归?简单来说,递归就是自己调用自己,每次调用自己都会创建新的栈帧。 2.什么是迷宫问题 任意位置的小球...

  • java算法之迷宫(递归)

  • 递归的应用:探索迷宫

    探索迷宫 将海龟放在迷宫中间,如何能找到出口 首先, 我们将整个迷宫的空间( 矩形)分为行列整齐的方格,区分出墙壁...

  • DFS搜索

    核心处理如下,已迷宫为例: 1、退出条件,到达目标位置; 2、搜索路径 3、递归搜索

  • 走迷宫算法(C回溯递归)

    引言 迷宫算法在很多场景都非常实用,比如游戏中的机器人等。而且高级的迷宫算法与回溯、递归也是息息相关的。而且回溯的...

网友评论

    本文标题:07-递归-迷宫

    本文链接:https://www.haomeiwen.com/subject/nqfmvrtx.html