-2

我需要编写一种方法来解决迷宫(二维数组)。我需要始终保持在墙的左侧,当我到达出口点(始终在同一位置)或没有解决方案时(并且,在穿过迷宫之后)我的方法应该结束我回到入口点)。

我能够做到这一切,没有问题,我可以直观地确保它正在做我想要它做的事情(我们的讲师提供了一些其他方法来输出视觉效果)并且我的控制台调试输出也是正确的。

这是相关代码:

public static void main(String[] args) {
    maze = generateMaze(10,10);
    walk(1,0,0);
}

public static void walk(int x, int y, int direction) {
    System.out.println("x = " + x + " y = " + y); //debug output
    draw(x,y,maze); //draws current position
    if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
        System.out.println("Geschafft!");
        return;
    }
    if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
        System.out.println("Keine Lösung möglich.");
        return;
    }
    if (direction == 0) { //go down
        if (maze [x][y+1]) {
            walk(x,y,1);
        }
        walk(x,y+1,2);
    }
    if (direction == 1) { //go right
        if(maze [x+1][y]) {
            walk(x,y,3);
        }
        walk(x+1,y,0);
    }
    if (direction == 2) { //go left
        if(maze [x-1][y]) {
            walk(x,y,0);
        }
        walk(x-1,y,3);
    }
    if (direction == 3) { //go up
        if(maze[x][y-1]) {
            walk(x,y,2);
        }
        walk(x,y-1,1);
    }    
}

只有一个问题:如何正确结束递归?这是我从控制台得到的:

x = 1 y = 0
x = 1 y = 1
x = 1 y = 1
x = 1 y = 2
and so on...
x = 8 y = 8
x = 9 y = 8
Geschafft!
x = 8 y = 9
x = 8 y = 9
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at maze.MazeSolution.walk(MazeSolution.java:26)
at maze.MazeSolution.walk(MazeSolution.java:39)
and some more of that

我确实理解错误,递归显然不会在我想要的地方结束,并且 x 或 y 会增加并尝试使用数组中不存在的索引。

当以下任何一种情况发生时,为什么递归不以 return 语句结束:

if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
    System.out.println("Geschafft!");
    return;
}
if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
    System.out.println("Keine Lösung möglich.");
    return;
} 

我需要做什么才能正确结束它?

我非常感谢您的帮助,对初学者表现出一些爱并告诉我该怎么做。

4

3 回答 3

1

添加到开头

public static void walk(int x, int y, int direction) {
  System.out.println("x = " + x + " y = " + y); //debug output
  if (x >= 10 ||  x < 0 || y >= 10 || y < 0) return;
于 2012-11-28T19:01:45.500 回答
0

查看您的回报以及您可能返回的地方。您可以在包含其他调用 walk 的封闭函数中间返回,而无需使用警卫来确保它们不被调用。

我建议重新实现你的逻辑;考虑使用 if/else 对来确保互斥。

于 2012-11-28T18:49:43.823 回答
0

为什么不简单地返回 true 或 false 并对其做出反应?

所以基本上你添加到你return true;的代码结束的两个结束案例。

if(walk(...)) return true;
于 2012-11-28T18:50:01.083 回答