我的2D迷宫求解器无限递归,并且堆栈溢出-为什么?

时间:2019-03-20 02:49:27

标签: c++ c++11 recursion stack-overflow maze

问题:-

我正在尝试使用二维数组解决C ++中的二维迷宫导航问题。为了给出有关问题本身的简要说明,我打算通过在数组中用“。”表示的自由空间来导航从节点“ S”到节点“ G”。节点“#”是障碍。一个人不得在标有障碍物的空间上移动。还必须注意使所有移动均作为合法移动(在配置空间内)。我将替换“。”后的有效动作用“ +”表示。如果您想了解有关此问题的更多信息(不必要),请参阅此link

出了什么问题?

我为此问题编写了一个递归算法,在该算法中,我们接收到一个数组和一个起始节点位置,然后尝试使用递归导航到目标节点。但是,我收到堆栈溢出错误。看来我的递归永远不会停止。我坚信play()函数或check()函数存在一些问题。我不确定到底是什么问题。

我尝试了什么?

我正在下面复制我的代码:

void spawn(std::string (&board)[6]) {
    for (int i = 0; i <= 6; i++) {
        std::cout << board[i] << std::endl;
    }
}

bool check(size_t a, size_t b, const std::string (&board)[6]) {
    if (a < board[1].size() && a >= 0 && b < board[1].size() && b >= 0) {
        if (board[a][b] == '#' || board[a][b] == '+')
            return false;
        else if (board[a][b] == '.')
            return true;
    }
    return false;
}

void play(std::string (&board)[6], size_t a, size_t b) {
    auto status = check(a, b, board);
    if (board[a][b] == 'G' || board[a][b] == 'g') {
        spawn(board);
        return;
    }
    if (status) {
        board[a][b] = '+';
        play(board, ++a, b);
        play(board, --a, b);
        play(board, a, ++b);
        play(board, a, --b);
    }
}

int main() {
    std::string grid[6] = {{"S#####"},
                           {".....#"},
                           {"#.####"},
                           {"#.####"},
                           {"...#.G"},
                           {"##...#"}};
    play(grid, 0, 0);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

check函数可防止递归,因为它会在起始位置看到网格中的“ S”。更改:

else if (board[a][b] == '.')

else if (board[a][b] == '.' || board[a][b] == 'S')

让它为我工作。

答案 1 :(得分:0)

感谢Perette和Renired Ninja的见解。根据您的建议以及我自己的更多想法,我重构了play()和check()函数。

我发现与分段错误有关的主要问题不为字符串{{1的末尾提供'\ 0'字符 }}。我忽略了它,因为我认为字符串数组的功能与char数组的功能不同(因为它们不是相同的种类)。现在,我意识到即使对于字符串数组,“ \ 0”也是必需的!

为了实现本文的完整性,我正在复制重构的功能:

grid