八皇后问题C++递归实现,并打印所有可能的92种情况
时间: 2024-12-19 10:26:19 浏览: 6
八皇后问题是一个经典的回溯算法问题,目标是在一个8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列以及对角线上。以下是使用C++递归实现的代码,并打印出所有可能的解:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 检查当前位置(row, col)是否可以放置皇后
bool is_safe(vector<vector<int>>& board, int row, int col) {
// 检查列冲突
for (int i = 0; i < row; ++i) {
if (board[i][col] == 1) {
return false;
}
}
// 检查左上方对角线冲突
int di = row - col;
if (di >= 0 && board[di][col] == 1) {
return false;
}
// 检查右上方对角线冲突
di = row + col;
if (di < 8 && board[di][col] == 1) {
return false;
}
return true;
}
// 递归放置皇后
void solveNQueens(vector<vector<int>>& board, int row, vector<bool>& used) {
if (row == 8) { // 当放置到最后一行,解决方案找到
for (int i = 0; i < 8; ++i) {
cout << "皇后放在第" << i+1 << "行: ";
for (int j = 0; j < 8; ++j) {
if (board[j][i] == 1) {
cout << i+1 << " ";
} else {
cout << ". ";
}
}
cout << endl;
}
return;
}
// 对于每一列尝试放置皇后
for (int col = 0; col < 8; ++col) {
if (is_safe(board, row, col)) {
board[row][col] = 1; // 将皇后放在指定位置
used[col] = true; // 标记该列已使用
// 继续在下一行寻找解决方案
solveNQueens(board, row + 1, used);
// 回溯,如果当前行没放好,撤销这一选择
board[row][col] = 0;
used[col] = false;
}
}
}
int main() {
vector<vector<int>> board(8);
vector<bool> used(8, false);
solveNQueens(board, 0, used);
return 0;
}
```
当你运行这段代码,它会打印出所有合法的8皇后布局,共92种情况。
阅读全文