c++ - 为什么在堆栈仍有元素时跳过 "if stack not empty"条件?

标签 c++ stack backtracking

我正在尝试编写一个程序来解决八皇后问题,但是它一直在到达最后一次返回,而它不应该,并尝试将它放在其他地方,但后来它从未到达它,即使我最初给它一个空堆栈。 同样出于某种原因,我第一次调用 top() 函数时,它返回的元素与我上次添加的元素不同,但如果我再次调用它,它会返回正确的元素。 所以我想知道问题出在哪里?

bool search(stack<nodo>& board, int n) {
    nodo queen;
    queen=board.top();
    queen=board.top();
    if (queen.y == n)
        return true;

    bool valid;
    if (!board.empty()) {
        queen.y += 1;
        for(int i; i<=n; i++) {
            queen.x = i;
            valid = isvalid(queen,board);
            if (valid) {
                board.push(queen);
                search(board,n);
            }
        }
        board.pop();
    }

    return false;
}

最佳答案

使用 while 而不是 if

while(!board.empty()) {

    queen.y += 1;
    for(int i; i<=n; i++){
        queen.x = i;
        valid = isvalid(queen,board);

        if (valid) {

            board.push(queen);
            search(board,n);
        }

    }

    board.pop();
}

if 表示只检查一次,但是 while 表示做同样的事情直到 board.empty() == true

关于c++ - 为什么在堆栈仍有元素时跳过 "if stack not empty"条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562985/

相关文章:

c - 中缀到后缀 C 程序

java - StackEmptyException 意外发生

algorithm - 高度h的二叉搜索树构建

java - 二维迷宫求解器递归函数

java - 我的数独回溯算法仅在部分时间有效,有人可以帮助我改进它吗?

c++ - 在 x64 配置下访问证书公钥

c++ - 拥有一个与非线程局部变量同名的线程局部变量是否可以?

c++ - 对c++ vector 的交集

c++ - 更新进程地址空间中的 HTML 内容

java - java中的链表堆栈