我正在使用什麼是深度優先搜索來解決迷宮使用我自己的堆棧創建的類作業。我相信我得到這個錯誤的原因是因爲我的程序從未滿足finishSpot
的條件。我已經使用了調試器,它看起來像是無限地停留在finishSpot
之前的Point處。我的邏輯似乎大部分是正確的,除非我的迷宮求解器試圖完成迷宮,所以我只需要幫助滿足導致我的程序崩潰的最後一個條件。搜索算法導致StackOverFlowError
這是一個示例迷宮,其中's'開始,'f'結束,'*'是牆。
*****
*s* *
* * *
* f*
*****
這是我的主要使用我的LinkedStack類,我可以發佈如果需要。
//Creates a Stack and determines the start and endpoints.
public static void solveDFS(char [][] maze){
LinkedStack stack = new LinkedStack();
Point currentSpot = findPoint(maze,'s');
Point finishSpot = findPoint(maze, 'f');
findPath(maze,currentSpot, finishSpot,stack);
}
//Finds a point by searching for a char.
private static Point findPoint(char [][] maze, char c) {
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[i].length; j++) {
if (maze[i][j] == c) {
return new Point(i, j);
}
}
}
return null;
}
//Search algorithm looks for all neighbor locations
private static boolean findPath(char [][] maze, Point currentSpot, Point finishSpot, LinkedStack stack){
boolean hasSolution = false;
stack.push(currentSpot);
while(currentSpot != finishSpot && !stack.isEmpty()){
// Checks Right
if(currentSpot.x < maze.length){
if(maze[currentSpot.x + 1][currentSpot.y] == ' '){
stack.push(new Point(currentSpot.x + 1, currentSpot.y));
}
}
// Checks Left
if(currentSpot.x > 0){
if(maze[currentSpot.x - 1][currentSpot.y] == ' '){
stack.push(new Point(currentSpot.x - 1, currentSpot.y));
}
}
// Checks Up
if(currentSpot.y > 0){
if(maze[currentSpot.x][currentSpot.y - 1] == ' '){
stack.push(new Point(currentSpot.x, currentSpot.y - 1));
}
}
// Checks Down
if(currentSpot.y < maze[currentSpot.x].length){
if(maze[currentSpot.x][currentSpot.y + 1] == ' '){
stack.push(new Point(currentSpot.x, currentSpot.y + 1));
}
}
// Checks Finish (My program never meets this condition help!)
if(currentSpot == finishSpot){
printMaze(maze);
hasSolution = true;
}
currentSpot = stack.pop();
findPath(maze, currentSpot, finishSpot, stack);
}
return hasSolution;
}
'如果(currentSpot == finishSpot)'...我不認爲你應該使用''==這裏。改用'if(currentSpot.equals(finishSpot))'並在'Point'類中覆蓋'equals'和'hashCode'。 – Tom
爲什麼要使用堆棧而不是遞歸? – mangusta
@mangusta這是我需要這樣做的任務。 – JCCS