用C++编写八皇后问题并给出详细代码
时间: 2024-03-10 11:43:12 浏览: 149
以下是用C++编写八皇后问题的详细代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
void solveNQueens(int n, int row, vector<int>& col, vector<vector<int>>& res) {
if (row == n) { // 找到一组解
res.push_back(col);
return;
}
for (int i = 0; i < n; ++i) { // 枚举该行的每一列
bool ok = true;
for (int j = 0; j < row; ++j) { // 检查是否与前面的皇后冲突
if (col[j] == i || abs(col[j] - i) == abs(row - j)) {
ok = false;
break;
}
}
if (ok) { // 如果不冲突,放置皇后并继续递归
col[row] = i;
solveNQueens(n, row + 1, col, res);
}
}
}
vector<vector<int>> nQueens(int n) {
vector<vector<int>> res;
vector<int> col(n); // col[i] 表示第 i 行皇后所在的列
solveNQueens(n, 0, col, res);
return res;
}
int main() {
int n = 8;
vector<vector<int>> res = nQueens(n);
for (int i = 0; i < res.size(); ++i) {
cout << "Solution " << i + 1 << ":" << endl;
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
if (res[i][j] == k) cout << "Q ";
else cout << ". ";
}
cout << endl;
}
cout << endl;
}
return 0;
}
```
该代码中,`solveNQueens`函数通过回溯算法来解决八皇后问题,`nQueens`函数是对`solveNQueens`函数的封装,`main`函数调用`nQueens`函数并输出结果。
具体来说,`solveNQueens`函数的参数依次为:棋盘大小`n`、当前处理的行数`row`、每行皇后所在的列数`col`、所有解`res`。函数首先判断是否找到了一组解,如果是,则将当前的皇后位置保存到`res`中。否则,枚举当前行的每一列,检查是否与前面的皇后冲突,如果不冲突,则将皇后放在该位置,并继续递归处理下一行。如果所有列都尝试过了,但是没有找到解,则回溯到上一行,重新放置皇后。
`nQueens`函数是对`solveNQueens`函数的封装,创建一个空的`res`数组,并调用`solveNQueens`函数来解决八皇后问题,最终返回`res`数组。
`main`函数首先调用`nQueens`函数来解决八皇后问题,然后输出每组解的棋盘布局。在输出棋盘布局时,用`Q`表示皇后的位置,用`.`表示空位。
阅读全文