【问题标题】:Solving maze using recursion (2 disrections) in java在java中使用递归(2个方向)解决迷宫
【发布时间】:2017-12-27 22:44:08
【问题描述】:

我在这个问题上需要帮助。我想使用递归来求解 NxN 二进制矩阵。问题是我认为我的递归实现在某种程度上是不正确的。在这个问题中,我只能向右和向下走。我检查了 issafe() 方法,根据 1=true 和 0=false,一切似乎都返回 true 或 false。如果我运行运行程序,什么都不会显示。任何帮助将非常感激。

public class Main {

    public static void main(String[] args) {

        int maze[][] = {{1, 0, 0, 0},
                        {1, 1, 0, 1},
                        {0, 1, 0, 0},
                        {1, 1, 1, 2}
        };
Maze rat = new Maze();
rat.solveMaze(maze, 0, 0);



    }

}

public class Maze {
    int maze[][];
    int mazeSize;
    int EXIT=2;

    public Maze() {

        mazeSize=4;
        maze = new int[mazeSize][mazeSize];
    }

    // check is its safe to traverse

    public Boolean isSafe(int x, int y, int maze[][]){
        if (x>=0 && x<mazeSize && y>=0 && y<mazeSize && maze[x][y]==1){
            return true;
        }
        else return false;
    }


    boolean solveMaze(int maze[][],int x,int y){
        int solmaze[][]=    {   {0, 0, 0, 0},
                                {0, 0, 0, 0},
                                {0, 0, 0, 0},
                                {0, 0, 0, 0}};

        if(maze[x][y]==EXIT){
            solmaze[x][y]=1;
            printmaze(solmaze);
            return true;
        }

        if(isSafe(x, y,maze) && maze[x][y]==1){
            solmaze[x][y]=1;
            return true;
        }

        if(isSafe(x, y,maze)==true && solveMaze(maze,x+1,y)==true){// down

            solmaze[x][y]=1;
        }
        if(isSafe(x, y,maze)==true && solveMaze(maze,x,y+1)==true){//right

            solmaze[x][y]=1;
        }
        solmaze[x][y]=0;
        return false;
    }

    void printmaze(int maze[][]){//print maze
        for(int i=0;i<maze.length;i++){
            for(int j=0;j<maze.length;j++){
                System.out.print(maze[i][j]);
            }
            System.out.println();
        }
    }

}

【问题讨论】:

    标签: java arrays matrix maze


    【解决方案1】:

    我相信这就是您正在寻找的解决方案:

    public class Main2 {
    
        public static void main(String[] args) {
    
            int maze[][] = {{1, 0, 0, 0},
                    {1, 1, 0, 1},
                    {0, 1, 0, 0},
                    {1, 1, 1, 2}
            };
            Maze rat = new Maze();
            rat.solveAndPrintMaze(maze, 0, 0);
        }
    
    }
    
    public class Maze {
        int maze[][];
        int mazeSize;
        int EXIT=2;
    
        public Maze() {
    
            mazeSize=4;
            maze = new int[mazeSize][mazeSize];
        }
    
        // check is its safe to traverse
        public Boolean isSafe(int x, int y, int maze[][]){
            if (x>=0 && x<mazeSize && y>=0 && y<mazeSize && maze[x][y]>=1){
                return true;
            }
            else return false;
        }
    
        int solmaze[][]= {
                {0, 0, 0, 0},
                {0, 0, 0, 0},
                {0, 0, 0, 0},
                {0, 0, 0, 0}};
    
        boolean solveMaze(int maze[][],int x,int y){
    
            if(maze[x][y]==EXIT){
                solmaze[x][y]=1;
    //          printmaze(solmaze);
                return true;
            }
    
    //      if(isSafe(x, y,maze) && maze[x][y]==1){
    //          solmaze[x][y]=1;
    //          return true;
    //      }
    
            if(isSafe(x+1, y,maze)==true && solveMaze(maze,x+1,y)==true){// down
    
                solmaze[x][y]=1;
                return true;
            }
    
            if(isSafe(x, y+1,maze)==true && solveMaze(maze,x,y+1)==true){//right
    
                solmaze[x][y]=1;
                return true;
            }
    
            solmaze[x][y]=0;
            return false;
        }
    
        void printmaze(int maze[][]){//print maze
            for(int i=0;i<maze.length;i++){
                for(int j=0;j<maze.length;j++){
                    System.out.print(maze[i][j]);
                }
                System.out.println();
            }
        }
    
        void solveAndPrintMaze(int maze[][],int x,int y) {
            solveMaze(maze, x, y);
            printmaze(solmaze);
        }
    }
    

    【讨论】:

    • 第一个 if 语句应该是我返回矩阵的基本情况。如果我注释掉 printmaze 方法,那么如果它到达退出点,则什么都不会显示。
    • 因为我使用了另一种方法solveAndPrintMaze,这将保证解决方案迷宫总是被打印出来。
    • 非常感谢。但是你能解释一下为什么我的 printmaze 方法不适用吗?
    • 因为你最终会打印迷宫,而最后并不是每个位置都设置好solmaze。如果您调试代码,在设置 solmaze 的行中放置一个断点,您将看到 printmaze 在该行之前执行。
    • 另一种说法:在从递归调用返回solveMaze 之后,您将位置设置为正在访问,这样在您返回到初次通话。
    【解决方案2】:

    在您第一次调用 solveMaze 时,第二个 if 为真((0,0) 是安全的,并且那里有一个 1),因此您在没有打印任何内容的情况下返回 true

    也许如果您解释了这样做的目的,可以帮助修复它(很可能是通过删除它)。

    【讨论】:

    • 我正在尝试使用递归遍历矩阵。就像迷宫里的问题老鼠
    • 很好,但是由于我确定了 if 语句,您永远不会进行递归。
    【解决方案3】:

    您实际上并没有在这里尝试递归。要以您尝试的方式启动递归,您必须从其内部调用您的 solveMaze 方法。

    我错了。正确答案由下面的 Scott 给出。

    【讨论】:

    • 我确实在这里调用了它 if(isSafe(x, y,maze)==true && solveMaze(maze,x+1,y)==true){// down solmaze[x][ y]=1; }
    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2014-12-11
    • 2020-02-17
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多