【发布时间】: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