繁体   English   中英

行和列迷宫递归错误

[英]Rows and columns maze recursion error

我得到的代码包含了构建迷宫所需的一切。 我的工作是编写用于解决迷宫的makeMove方法。 这是我到目前为止:

protected void makeMove( int row, int col )
{
    int MAX_ROWS = maze.length;
    int MAX_COLS = maze.length;
    boolean found = false;
    boolean[][]visited = new boolean[MAX_ROWS][MAX_COLS];
    //visited[startRow][startCol] = true;
    if (row < 0 || row >= MAX_ROWS  || col < 0 || col >= MAX_COLS  || visited[row][col] || maze[row][col] == 1)
        return;

    visited[row][col] = true;
    found = row == endRow && col == endCol;

    /*if(row == endRow && col == endCol) {
        found = true;
    }*/
    if(!found && maze[row][col - 1]!=1 && !visited[row][col]) { // move left
        makeMove(row, col -1);
        visited[row][col -1] = true;
    }
    if(!found && maze[row - 1][col]!=1 && !visited[row-1][col]) { // move up
        makeMove(row-1, col);
        visited[row-1][col] = true;
    }
    if(!found && maze[row][col + 1]!=1 && !visited[row][col + 1]) { // move right
        makeMove(row, col + 1);
        visited[row][col + 1] = true;
    }
    if(!found && maze[row + 1][col]!=1 && !visited[row + 1][col]) { // move down
        makeMove(row + 1, col);
        visited[row + 1][col] = true;
    }

当在8行8列的迷宫中像这样运行时,我不断收到堆栈溢出错误。

我相信错误显示它位于第42行和第50行,这将是
42. MakeMove(row-1, col); //to move up
50.makeMove(row + 1, col); //to move down 50.makeMove(row + 1, col); //to move down

我在这两个中犯了逻辑错误吗?

你应该将迷宫的当前状态作为makeMove方法的参数。 您的案例中迷宫的状态是访问矩阵。

从你得到的错误判断,你的代码导致算法的“无限递归”一遍又一遍地调用自己,而不会在调用堆栈中的空间用完之前正确终止。 请注意,这并不意味着堆栈跟踪指示的行是错误的实际原因 - 它是程序空间不足的地方,但实际的错误逻辑通常位于其他地方。

一件肯定会造成麻烦的事情是:

boolean[][]visited = new boolean[MAX_ROWS][MAX_COLS];

这为递归的每个步骤创建了一个新的布尔二维数组(或者确切地说,布尔数组的数组),并将其初始化为false (因为这是Java中布尔值的默认值)。 因此,您的算法将继续访问它已访问过的图块,因为每个递归步骤都有自己的数组,充满了false表示每个图块仍未被访问。 通过将数组作为参数传递给每个递归调用,或将其存储在函数外部,可以修复此特定问题。

boolean[][]visited = new boolean[MAX_ROWS][MAX_COLS];

为每个递归调用生成上述状态不会存储状态值。 最好将它保存为全局变量或作为参数传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM