递归解迷宫问题

作者: spraysss | 来源:发表于2019-10-26 14:08 被阅读0次
  • 递归程序需要向退出条件逼近,否则就会形成死递归
  • 递归在方法结束或者遇到return时返回给调用者

使用递归解迷宫问题,使用二维数组表示迷宫

  • 0代表没有走过的路
  • 1代表墙
  • 2代表走过的路
  • 3 代表走过的路,但是是死路
  • *代表启始位置
  • ^ 代表终点

假设有7\times9的迷宫地图如下:

1 1 1 1 1 1 1 1 1 
1 * 0 0 0 0 0 0 1 
1 1 1 1 0 0 0 0 1 
1 0 0 1 0 1 0 0 1 
1 0 0 1 0 1 0 0 1 
1 0 0 1 0 1 0 ^ 1 
1 1 1 1 1 1 1 1 1 

算法步骤:

  1. 退出条件,走到终点maze[5][7],即maze[5][7]=2
  2. 回溯走法顺序为down 、right、up、left
  3. 如果路没有走过(maze[i][j]=0),首先将其标记为走过(maze[i][j]=2),然后按照步骤2中的走法尝试继续往下走,如果发现不能往下走(上下左右都没有未走过的路了),则将这个路标记为死路maze[i][j]=3
package com.yz.ds;

/**
 *     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 1 1 1 1 1 1 1 1
 */
public class Maze {
    private static void printMazeStatus(int maze[][]) {
        for (int i = 0; i < maze.length; i++) {
            for (int j = 0; j < maze[i].length; j++) {
                System.out.print(maze[i][j] + " ");
            }
            System.out.println();
        }
    }

    private static boolean doWalkDown(int maze[][], int i, int j) {
        return doWalk(maze, i + 1, j);
    }

    private static boolean doWalkRight(int maze[][], int i, int j) {
        return doWalk(maze, i, j + 1);
    }

    private static boolean doWalkUp(int maze[][], int i, int j) {
        return doWalk(maze, i - 1, j);
    }

    private static boolean doWalkLeft(int maze[][], int i, int j) {
        return doWalk(maze, i, j - 1);
    }


    private static boolean doWalk(int maze[][], int i, int j) {
        if (maze[5][7] == 2) {
            return true;
        } else if (maze[i][j] == 0) {
            maze[i][j] = 2;
            if (doWalkDown(maze, i, j) ||
                    doWalkRight(maze, i, j) ||
                    doWalkUp(maze, i, j) ||
                    doWalkLeft(maze, i, j)) {
                return true;
            } else {
                maze[i][j] = 3;
                return false;
            }
        } else {
            return false;
        }

    }


    public static void main(String[] args) {

        int maze[][] = new int[7][9];
        for (int i = 0; i < 9; i++) {
            maze[0][i] = maze[6][i] = 1;
        }
        for (int i = 0; i < 7; i++) {
            maze[i][0] = maze[i][8] = 1;
        }
        maze[2][1] = maze[2][2] = maze[2][3] = 1;
        maze[3][3] = maze[4][3] = maze[5][3] = 1;
        maze[3][5] = maze[4][5] = maze[5][5] = 1;
        
        
        doWalk(maze, 1, 1);
        printMazeStatus(maze);

    }
}

最终输出如下:

1 1 1 1 1 1 1 1 1 
1 2 2 2 2 0 0 0 1 
1 1 1 1 2 2 2 0 1 
1 0 0 1 3 1 2 0 1 
1 0 0 1 3 1 2 0 1 
1 0 0 1 3 1 2 2 1 
1 1 1 1 1 1 1 1 1 

相关文章

  • 递归解迷宫问题

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

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

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

  • 递归之迷宫问题

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

  • [AlgoGo]递归

    什么是递归? 递归就是自己调用自己。 什么样的问题可以用递归来解决? 一个问题的解可以分为几个规模更小的子问题的解...

  • 动态规划&贪心算法

    动态规划问题,问题可以分为子问题的最优解,从而递归下去。也可以自下而上的循环来解决,就是找到递归的终点,从递归的终...

  • 递归:如何用三行代码找到推荐人

    如何理解递归 递归需要满足的三个条件 1,一个问题的解可以分解为多个子问题的解2,这个问题和子问题处理数据规模不同...

  • 递归算法介绍及Java应用实战

    什么是递归算法 递归算法是把问题转化为规模缩小了的同类问题的子问题,然后递归调用函数(或过程)来表示问题的解。一个...

  • day07递归-迷宫问题

    递归 概念: 递归就是自己调用自己,每次调用都传入不同的变量,递归有助于编程者解决复制的问题,同时也可以让代码变得...

  • 天花板编程手把手计划-第1期-第4天

    由于迷宫的问题难度太大,有些人没有及时完成,所以这一篇晚发出一天。通过迷宫的问题,暴露出大家对递归掌握的不是很好,...

  • 递归求解迷宫

    效果图 结果图 完整代码

网友评论

    本文标题:递归解迷宫问题

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