用回溯法求八皇后的所有情况的解 用C++的代码写出来
时间: 2024-09-24 20:04:06 浏览: 33
回溯算法是一种通过递归尝试所有可能性并撤销那些导致无效解的操作来寻找问题所有解的方法。对于八皇后问题,我们需要在一个8x8的棋盘上放置八个皇后,使得任意两个皇后都不在同一行、同一列,以及同一斜线上。
以下是使用C++实现的简单回溯法求解八皇后问题:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 检查当前位置是否合法
bool isSafe(int board[N], int row, int col) {
// 检查列冲突
for (int i = 0; i < row; ++i)
if (board[i] == col)
return false;
// 检查左上方对角线冲突
int-diag = row - col;
for (int i = 0; i < diag; ++i)
if (board[row-i-1] == col+i)
return false;
// 检查右上方对角线冲突
int+diag = row + col;
for (int i = 0; i < +diag; ++i)
if (board[row-i] == col-i)
return false;
return true;
}
// 回溯函数
void solveNQueens(vector<int>& board, int n, int row) {
// 如果放置到最后一行,表示找到一组解
if (row == n) {
for (int num : board) {
cout << num << " ";
}
cout << endl;
return;
}
// 遍历每一列
for (int col = 0; col < n; ++col) {
// 如果当前位置合法,放置皇后并继续下一行
if (isSafe(board, row, col)) {
board[row] = col;
solveNQueens(board, n, row + 1);
// 回溯,如果找不到其他解,则移除当前皇后的位置
board[row] = -1;
}
}
}
int main() {
int N = 8;
vector<int> board(N, -1); // 初始化棋盘
solveNQueens(board, N, 0);
return 0;
}
阅读全文