ZBLOG

在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。用递归算法解决该问题。 编程要求 请在右侧编辑器Begin-End处补充代码,完成本关任务。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:4(皇后的数目) 预期输出: * Q * * * * * Q Q * * * * * Q * * * ...

#include <iostream>
#include <vector>

using namespace std;

// 判断当前位置是否与已放置的皇后冲突
bool isConflict(vector<int>& queens, int row, int col) {
    for (int i = 0; i < row; ++i) {
        // 判断是否在同一列或者同一斜线上
        if (queens[i] == col || abs(i - row) == abs(queens[i] - col)) {
            return true;
        }
    }
    return false;
}

// 递归回溯函数
void backtrack(vector<vector<int>>& res, vector<int>& queens, int n, int row) {
    if (row == n) {
        res.push_back(queens);
        return;
    }

    for (int col = 0; col < n; ++col) {
        if (!isConflict(queens, row, col)) { // 当前位置不冲突,可以放置皇后
            queens[row] = col;
            backtrack(res, queens, n, row + 1); // 继续搜索下一行
            queens[row] = -1; // 恢复状态,进行下一个尝试
        }
    }
}

// 解决n皇后问题
vector<vector<int>> solveNQueens(int n) {
    vector<vector<int>> res;
    vector<int> queens(n, -1); // 用于记录每行皇后所在的列号

    backtrack(res, queens, n , 0);

    return res;
}

// 打印结果棋盘
void printBoard(const vector<vector<int>>& board) {
    int n = board.size();
    
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (board[i][j] == -1) {
                cout << " * ";
            } else {
                cout << " Q ";
            }
        }
        cout << endl;
    }
}

int main() {
    int n;
    cin >> n;

    vector<vector<int>> solutions = solveNQueens(n);

    for (const auto& solution : solutions) {
        printBoard(solution);
        cout << endl;
    }

    return 0;
}

这是一个使用递归回溯算法解决n皇后问题的代码实现。首先定义了两个辅助函数:

  • isConflict 函数用于判断当前位置与已放置的皇后是否冲突,根据规则判断是否在同一列或者同一斜线上。
  • backtrack 函数是递归的回溯函数,它负责从第一行开始搜索,并不断尝试不同的列来放置皇后。如果某个位置可以放置皇后且不冲突,则继续向下一行搜索;如果不能放置或冲突,则进行下一个尝试。

然后,在主函数中调用 solveNQueens 函数来解决n皇后问题。该函数创建了一个二维向量 res 来保存所有的解,初始化每行皇后所在的列号为 -1,并通过调用 backtrack 函数进行搜索。最后,遍历所有解,调用 printBoard 函数打印结果棋盘。

根据题目描述,输入4时预期输出为2种摆放方案的棋盘。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=12188

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?