【发布时间】:2021-02-08 09:45:52
【问题描述】:
我写了一个方法,通过堆栈和递归解决给定的文本编辑器迷宫,它解决了迷宫。但是,我的问题是,当给出的迷宫无法解决时,因为迷宫的墙壁实际上是不可能解决的,就好像我的基本情况被跳过并且不返回错误一样。这是代码
private boolean findPath(MazeLocation cur, MazeLocation finish) {
int row = cur.row;
int col = cur.col;
mazeToSolve.setChar(row, col, 'o');
fileWriter.println("\n"+mazeToSolve.toString());
char strX = 'X';
char strH = 'H';
// First ,we need to scan the 4 directions around current location to see where to go
MazeLocation up = new MazeLocation(row-1, col);
MazeLocation down = new MazeLocation(row+1, col);
MazeLocation right = new MazeLocation(row, col+1);
MazeLocation left = new MazeLocation(row, col-1);
// BASE CASE - WHEN WE'VE REACHED FINISH COORDINATES
if(cur.row == finish.row && cur.col == finish.col){
return true;
}
// SECOND BASE CASE - IF MAZE ISNT SOLVABLE
if (path.isEmpty() == true){ // if the path is empty, then there is no solution.
return false;
}
// Check if we can go up
if(up.getRow() >= 0){
if(mazeToSolve.getChar(up.getRow(), up.getCol()) == ' '){
row = up.getRow();
col = up.getCol();
MazeLocation newCur = new MazeLocation(row, col);
path.push(newCur);
return findPath(newCur, finish);
}
}
// Check if we can go down
if(down.getRow() < mazeToSolve.getRows()){
if(mazeToSolve.getChar(down.getRow(), down.getCol()) == ' '){
row = down.getRow();
col = down.getCol();
MazeLocation newCur = new MazeLocation(row, col);
path.push(newCur);
return findPath(newCur, finish);
}
}
// Check if we can go right
if(right.getCol() < mazeToSolve.getCols()){
if(mazeToSolve.getChar(right.getRow(), right.getCol()) == ' '){
row = right.getRow();
col = right.getCol();
MazeLocation newCur = new MazeLocation(row, col);
path.push(newCur);
return findPath(newCur, finish);
}
}
// Check if we can go left
if(left.getCol() >= 0){
if(mazeToSolve.getChar(left.getRow(), left.getCol()) == ' '){
row = left.getRow();
col = left.getCol();
MazeLocation newCur = new MazeLocation(row, col);
path.push(newCur);
return findPath(newCur, finish);
}
}
// If we cant do any of the above then we need to backtrack by popping the top of stack
// and leaving X's until we can move up, down, left, or right again.
MazeLocation newCur = new MazeLocation(row, col);
path.pop(); // popping the cur where we are putting the x
mazeToSolve.setChar(row, col, 'x'); // putting the x
return findPath(path.top(), finish); // now we need to return to the position where the stack is NOW after the pop
}
如您所见,有两种基本情况。一个返回真 - 迷宫解决了。另一个返回 false - 迷宫是无法解决的。我的 isEmpty() 方法的代码是这样的:
public boolean isEmpty() {
if(head == null){
return true;
}
return false;
}
它通过检查堆栈是否为空来返回 false。例如,如果迷宫跑步者撞到墙壁并转身,它将在文本编辑器中留下一个 x,如下所示:
0123456
0HHHHHHH
1ooooxxH
2HHHoHxH
3H oHxH
4H HoHHH
5H Hoooo
6HHHHHHH
迷宫从 6,5 开始;并在 0,1 结束。这是可以解决的。 x 代表失败的路线,o 代表从开始到结束的路径。
在下一个示例迷宫中,当代码从 7,6 开始时,不可能完成。
HHHHHHH
H
HHH H H
H H H
H HHHHH
H H
HHHHHHH
它会尝试向左移动两次,留下 x,然后堆栈会弹出,直到没有堆栈并且堆栈的顶部指向 null。但是我的基本案例代码被跳过了,它应该在尝试弹出空堆栈之前测试堆栈是否为空,如果是,则返回 false。但事实并非如此。有什么帮助吗?
【问题讨论】:
-
这似乎无法编译,因为没有声明“路径”
-
从 (7,6) 开始迷宫有没有位置?
-
它会编译,path 是在另一个方法中声明的 Stack 对象。 Eklavya 是什么意思?
-
您是否为您的项目使用了特定的库?
-
不,@bdzzaid 没有什么特别的,一定是函数出了问题,导致它跳过为 isEmpty() 返回 false。我已经单独测试了 isEmpty() 并且它有效。