我正在使用递归来解决迷宫问题。我的矩阵看起来像这样
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;
答案 0 :(得分:3)
您对网格的坐标系感到困惑。在您的情况下,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.
从不考虑边缘值。