C++在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。按给定顺序和格式输出所有八皇后问题的解
时间: 2024-10-16 16:14:43 浏览: 38
C++ 中解决八皇后问题通常会采用回溯算法(Backtracking)来尝试所有可能的布局。八皇后问题是一个经典的逻辑谜题,目标是在一个8x8的棋盘上放置8个皇后,要求任意两个皇后都不能在同一行、同一列或同一斜线上。以下是一个简单的 C++ 实现:
首先定义一个 `bool` 类型的二维数组,用来检查每一位置是否已经有皇后:
```cpp
bool isSafe(int row, int col, vector<vector<bool>>& board) {
// Check if the current position is safe horizontally and diagonally
return row >= board.size() || !board[row][col] && !isAttacking(row, col, board);
}
bool isAttacking(int row, int col, vector<vector<bool>>& board) {
// Check two diagonal directions
int leftDiagonal = row - col;
int rightDiagonal = row + col;
return leftDiagonal >= 0 && leftDiagonal < board.size() && board[leftDiagonal][col]
|| rightDiagonal >= 0 && rightDiagonal < board.size() && board[rightDiagonal][col];
}
```
接着编写回溯函数来尝试放置皇后:
```cpp
void solveNQueens(vector<vector<bool>>& board, int n, int row) {
if (row == n) { // Base case: all queens are placed
printBoard(board);
return;
}
// Try each column in the current row
for (int col = 0; col < n; ++col) {
if (isSafe(row, col, board)) {
board[row][col] = true; // Place the queen
// Move to next row
solveNQueens(board, n, row + 1);
// If placing this queen didn't lead to a solution, backtrack
board[row][col] = false; // Remove the queen
}
}
}
```
然后在主函数中初始化棋盘和调用 `solveNQueens` 函数:
```cpp
int main() {
vector<vector<bool>> board(n, vector<bool>(n, false));
solveNQueens(board, n, 0);
return 0;
}
```
最后的 `printBoard` 函数用于以指定格式输出棋盘状态:
```cpp
void printBoard(vector<vector<bool>>& board) {
for (int i = 0; i < board.size(); ++i) {
for (int j = 0; j < board.size(); ++j) {
cout << (board[i][j] ? "Q " : ".");
}
cout << endl;
}
}
```
这样,当运行程序时,它将会按照回溯策略找到所有的八皇后解决方案并打印出来。注意,由于回溯法的特性,该方法可能会生成大量的解决方案,但它们都是唯一且符合规则的。
阅读全文