#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助手提供,问题来源于学员提问




