用C++写 八皇后 这个题
时间: 2023-11-14 15:56:46 浏览: 83
下面是一个用C++编写的八皇后问题的解决方案:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 检查当前位置是否合法
bool isSafe(vector<int>& board, int row, int col)
{
// 检查同一列上是否有皇后
for (int i = 0; i < row; i++) {
if (board[i] == col) {
return false;
}
}
// 检查左上对角线是否有皇后
for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
if (board[i] == j) {
return false;
}
}
// 检查右上对角线是否有皇后
for (int i = row, j = col; i >= 0 && j < board.size(); i--, j++) {
if (board[i] == j) {
return false;
}
}
return true;
}
// 在当前行放置皇后
void placeQueen(vector<int>& board, int row, int n, vector<vector<int>>& solutions)
{
if (row == n) {
// 找到一个解,将其保存到结果集中
solutions.push_back(board);
return;
}
for (int col = 0; col < n; col++) {
if (isSafe(board, row, col)) {
// 当前位置合法,放置皇后
board[row] = col;
// 继续放置下一行的皇后
placeQueen(board, row + 1, n, solutions);
// 回溯,尝试下一个位置
board[row] = -1;
}
}
}
// 打印棋盘
void printBoard(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) {
cout << "Q ";
} else {
cout << ". ";
}
}
cout << endl;
}
cout << endl;
}
// 解决八皇后问题
vector<vector<int>> solveNQueens(int n)
{
vector<vector<int>> solutions;
vector<int> board(n, -1); // 初始化棋盘,-1表示空位置
placeQueen(board, 0, n, solutions);
return solutions;
}
int main()
{
int n = 8; // 棋盘大小为8x8
vector<vector<int>> solutions = solveNQueens(n);
cout << "共找到 " << solutions.size() << " 个解:" << endl;
for (const auto& solution : solutions) {
printBoard(solution);
}
return 0;
}
```
这段代码使用回溯算法来解决八皇后问题。首先定义了一个`isSafe`函数来检查当前位置是否合法,然后定义了`placeQueen`函数来在当前行放置皇后,并递归地继续放置下一行的皇后。最后,使用`solveNQueens`函数来解决八皇后问题,并将所有的解保存在`solutions`中,然后使用`printBoard`函数来打印棋盘。运行程序将会输出所有的八皇后解。
阅读全文