搜索算法导致StackOverFlowError

时间:2015-04-29 09:22:15

标签: java stack depth-first-search

我正在使用所谓的深度优先搜索来使用我自己的Stack创建的类来解决迷宫。我相信我收到此错误的原因是因为我的程序永远不会满足finishSpot条件。我使用了调试器,看起来它在finishSpot之前无限地停留在Point处。我的逻辑似乎大多是正确的,除非我的迷宫求解器试图完成迷宫,所以我只需要帮助满足导致程序崩溃的最后一个条件。

这是一个样本迷宫,其中's'开始,'f'结束,'*'是墙。

*****
*s* *
* * *
*  f*
*****

这是我的Main,它使用我的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;
}

2 个答案:

答案 0 :(得分:0)

在您的代码中,以下条件永远不会同时为真

while( currentSpot != finishSpot && !stack.isEmpty() ){
    ...
    if( currentSpot == finishSpot ){

答案 1 :(得分:0)

我认为你不能比较Points这样的变量。 尝试覆盖方法equals

阅读this question