微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我解决N个皇后区问题的回溯解决方案不起作用?

如何解决为什么我解决N个皇后区问题的回溯解决方案不起作用?

这是我通过传递args:0和board从主函数调用它时返回的输出,其中0是要从其开始的行号,而board是一个填充有零的4x4电路板:

9       1       1       1
1       1       9       1
1       1       1       1
1       0       1       1

注意:9表示皇后,1表示受到皇后攻击的牢房,0是既没有女王也不受到皇后攻击的安全牢房。

bool queen_placer(int row,std::vector<std::vector<int>> &board)
{
    if (row == board.size())
    {
        return true;
    }
    for (int col = 0; col < board[0].size(); coL++)
    {
        bool safe = is_valid(row,col,board); //is_valid returns true if the position doesn't contain any queen and is not attacked by any queen
        if (safe)
        {
            board[row][col] = 9;
            value_assigner(row,board); //value assigner just assigns the attack values of the queen so placed
            if (queen_placer(row++,board))
            {
                return true;
            }
            else
            {
                continue;
            }
        }
    }
    return false;
}

解决方法

您没有回溯-回溯涉及撤消导致失败的选择,但是您的board[row][col]是永远的。

如果递归失败,则需要将板恢复到以前的状态。

,

以下是正确的代码,仅在第9行和第21行进行了更改,从而解决了此问题:

bool queen_placer(int row,std::vector<std::vector<int>> &board)
{
    if (row == board.size())
    {
        return true;
    }
    for (int col = 0; col < board[0].size(); col++)
    {
        std::vector<std::vector<int>> board_prev = board; //Added line
        bool safe = is_valid(row,col,board); //is_valid returns true if the position doesn't contain any queen and is not attacked by any queen
        if (safe)
        {
            board[row][col] = 9;
            value_assigner(row,board); //value assigner just assigns the attack values of the queen so placed
            if (queen_placer(row + 1,board))
            {
                return true;
            }
            else
            {
                board = board_prev; //Added line
                continue;
            }
        }
    }
    return false;
}

以下是此代码提供的输出:

1       9       1       1
1       1       1       9
9       1       1       1
1       1       9       1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。