【问题标题】:Rows and columns maze recursion error行和列迷宫递归错误
【发布时间】:2013-12-05 01:50:11
【问题描述】:

我收到的代码包含构建迷宫所需的一切。我的工作是编写用于解决迷宫的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。

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

【问题讨论】:

    标签: java recursion stack-overflow backtracking maze


    【解决方案1】:
    boolean[][]visited = new boolean[MAX_ROWS][MAX_COLS];
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        您应该将迷宫的当前状态作为 makeMove 方法的参数。在您的情况下,迷宫的状态是访问矩阵。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-08
          • 1970-01-01
          • 1970-01-01
          • 2014-12-11
          • 2016-05-14
          相关资源
          最近更新 更多