尝试运行此代码时遇到错误,但在编译时却没有。在每个方向方法的最后,我按照应该进入的顺序调用下一个方法。我要做的是创建一个程序,从文件中读取迷宫并解决它。在解决问题的同时,我希望程序为它所采用的路径放置一个P,为已经访问过的地方放置一个V.该程序只允许向左前进,然后返回每个方向。当你走向不同的方向时,你将不得不遵循这些规则,除了你面对的方式现在是新的前锋。
迷宫代码:
public static boolean goNorth(){
boolean success;
if(maze[startCol][startRow] == maze[finishCol][finishRow]){
return true;
}
if(maze[startCol][startRow - 1] == CLEAR){
maze[startCol][startRow - 1] = PATH;
startRow = startRow - 1;
goNorth();
if(maze[startCol][startRow - 1] == PATH){
maze[startCol][startRow - 1] = VISITED;
startRow = startRow - 1;
goNorth();
if (maze[startCol][startRow - 1] == VISITED){
goSouth();
}
}
}
goWest();
return true;
}
public static boolean goEast(){
boolean success;
if(maze[startCol][startRow] == maze[finishCol][finishRow]){
return true;
}
if(maze[startCol + 1][startRow] == CLEAR){
maze[startCol + 1][startRow] = PATH;
startCol = startCol + 1;
goEast();
if(maze[startCol + 1][startRow] == PATH){
maze[startCol + 1][startRow] = VISITED;
startCol = startCol + 1;
goEast();
if(maze[startCol + 1][startRow] == VISITED){
goWest();
}
}
}
goNorth();
return false;
}
public static boolean goSouth(){
boolean success;
if(maze[startCol][startRow] == maze[finishCol][finishRow]){
return true;
}
if(maze[startCol][startRow + 1] == CLEAR){
maze[startCol][startRow + 1] = PATH;
startRow = startRow + 1;
goSouth();
if(maze[startCol][startRow + 1] == PATH){
maze[startCol][startRow + 1] = VISITED;
startRow = startRow + 1;
goSouth();
if (maze[startCol][startRow + 1] == VISITED){
goNorth();
}
}
}
goEast();
return false;
}
public static boolean goWest(){
boolean success;
if(maze[startCol][startRow] == maze[finishCol][finishRow]){
return true;
}
if(maze[startCol - 1][startRow] == CLEAR){
maze[startCol - 1][startRow] = PATH;
startCol = startCol - 1;
goWest();
if(maze[startCol - 1][startRow] == PATH){
maze[startCol - 1][startRow] = VISITED;
startCol = startCol - 1;
goWest();
if(maze[startCol - 1][startRow] == VISITED){
goEast();
}
}
}
goSouth();
return false;
}
}
Maze.txt:
20 7
0 18
6 12
xxxxxxxxxxxxxxxxxx x
x x xxxx x
x xxxxx xxxxx xx x
x xxxxx xxxxxxx xx x
x xx xx x
x xxxxxxxxxx xx x
xxxxxxxxxxxx xxxxxxx
错误:
答案 0 :(得分:4)
知道了。您的代码首先调用North,如果不清楚调用West,如果不清楚调用South,则调用East。不幸的是,你的东部呼叫不清楚,然后再次呼叫北,这将循环上面,吹你的筹码。你的递归需要一个更好的终止案例。
此外,此处没有“地图边缘”检测,因此在初始条件不佳的情况下可能会退出迷宫并丢弃内存。想象你的起始位置在迷宫的北边。你的第一个电话就是去北方,这会读取你的阵列并将事情搞砸。你需要在洪水填充中检查地图大小,走迷宫呼叫。