【问题标题】:Recursive Maze Algorithm递归迷宫算法
【发布时间】:2014-03-17 23:45:11
【问题描述】:

我正在使用递归解决迷宫。我的矩阵是这样的

char maze[][] = 
    {
        {'#','#','#','#','#','#','#','#','#','#','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#','#','#','#',' ','#','#','#','#','#','#'},
        {'#',' ',' ',' ',' ','#',' ',' ',' ',' ','X'},
        {'#',' ',' ',' ',' ','#',' ',' ',' ',' ','#'},
        {'#',' ','#','#','#','#','#','#',' ','#','#'},
        {'#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
        {'#','#','#','#','#','#','#','#','#','#','#'},

    };

这是更大矩阵的原型。 我的求解递归方法是这样的

private void solve(int x, int y) {
    // set everything to false
    wasHere = new boolean[maze.length][maze[1].length];
    correctPath = new boolean[maze.length][maze[1].length];
     for (int i = 0; i < maze.length; i++){  
            // Sets boolean Arrays to default values
            for (int j = 0; j < maze[i].length; j++){
                wasHere[i][j] = false;              // set everything to false
                correctPath[i][j] = false;          
            }
     }
boolean b = solveRecursion(1,1);
System.out.println(b);

}

您可以在这里注意到,我返回一个布尔值,如果我找到路径,它应该给我一个真值。但它一直在给我虚假。我不确定我在 solveRecursion 方法中所犯的逻辑错误。方法是这样的

    private boolean solveRecursion(int x, int y) {
        if (x == endX && y == endY){
            return true;
        }
        if (maze[x][y] == '#' || wasHere[x][y]){
            return false;
        }
        wasHere[x][y]=true;
        if (x != 0) // Checks if not on left edge
            if (solveRecursion(x-1, y)) { // Recalls method one to the left
                correctPath[x][y] = true; // Sets that path value to true;
                maze[x][y]='S';
                return true;
            }
        if (x != maze[0].length ) // Checks if not on right edge
                if (solveRecursion(x+1, y)) { // Recalls method one to the right
                    correctPath[x][y] = true;
                    maze[x][y]='S';
                    return true;
            }
        if (y != 0)  // Checks if not on top edge
            if (solveRecursion(x, y-1)) { // Recalls method one up
                correctPath[x][y] = true;
                maze[x][y]='S';
                return true;
           }
        if (y != maze.length) // Checks if not on bottom edge
            if (solveRecursion(x, y+1)) { // Recalls method one down
                correctPath[x][y] = true;
                maze[x][y]='S';
                return true;
            }
        return false;


}

endX =3; endY =10;

【问题讨论】:

  • .. 将调试器附加到 solveRecursion 的开头并监视确实发生的调用。然后,您将能够确定“错误”发生的时间/地点。
  • 当你调用这个时:“solveRecursion(x-1, y) // 调用左边的方法一”你实际上并没有用左边的元素调用方法,而是用元素就是上面。
  • @DavidHarkness 如果您指的是矩阵。然后它们不是重复的,第 4 行末尾有一个“X”,而第 5 行有一个“#”。我的程序必须转到 X。程序的早期部分我找出了“X”在数组中的位置。那么我现在正在尝试解决数组。在这种情况下,我想找到从给定点 (1,1) 到 X 位置的最短路径。
  • 正如用户@user286474 提到的,使用调试器来解决问题,尤其是当你的矩阵不是那么大时。
  • @user3422137 啊,是的,我现在明白了。

标签: java algorithm recursion matrix maze


【解决方案1】:

您对网格的坐标系感到困惑。在您的情况下,X 代表行数,而 Y 代表列数。

您正在查看if (y != maze.length),如果是这样,您将“向下移动”,实际上是移动到右侧,而不是向下移动。

这种混乱使你的 Y 坐标受到 X 值的限制。

你应该把那一行改成:

 if (y != maze[0].length)

这样可以解决问题。就目前而言,您永远不会达到距离末尾仅 1 的值 (3,9),因为您的 if 语句检查坐标 (8,9) 并说:

 if (y != maze.length) // Hmm. my coordinates are (8,9) so y = 9. 
                       // maze.length is 9, so this is false.

并且从不考虑边缘值。

【讨论】:

  • 非常感谢...效果很好.. (x != maze.length ) (y != maze[0].length ) 这可以解决问题...