我需要编写一种方法来解决迷宫(二维数组)。我需要始终保持在墙的左侧,当我到达出口点(始终在同一位置)或没有解决方案时(并且,在穿过迷宫之后)我的方法应该结束我回到入口点)。
我能够做到这一切,没有问题,我可以直观地确保它正在做我想要它做的事情(我们的讲师提供了一些其他方法来输出视觉效果)并且我的控制台调试输出也是正确的。
这是相关代码:
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;
}
我需要做什么才能正确结束它?
我非常感谢您的帮助,对初学者表现出一些爱并告诉我该怎么做。