请给我生成八皇后的回溯法
时间: 2024-12-22 15:25:05 浏览: 4
八皇后问题是经典的回溯算法应用之一,目标是在一个8x8的棋盘上放置8个皇后,使得任意两个皇后都不在同一行、同一列或对角线上。下面是使用C++实现的简单版本的八皇后问题回溯算法:
```cpp
#include <iostream>
#include <vector>
bool is_safe(int row, int col, std::vector<std::vector<int>>& board) {
// 检查列是否冲突
for (int i = 0; i < row; ++i)
if (board[i][col] == 1)
return false;
// 检查左上到右下的对角线是否冲突
int di = row - col;
for (int i = 0; i < di; ++i)
if (board[row-i][col+i] == 1)
return false;
// 检查右上到左下的对角线是否冲突
di = row + col;
for (int i = 0; i < 8-row-di; ++i)
if (board[row+i][col-i] == 1)
return false;
return true;
}
void solveNQueens(int n, int row, std::vector<std::vector<int>>& board, bool& found) {
if (row == n) {
// 找到了解,打印出来
for (const auto& r : board) {
for (int c : r)
std::cout << c << " ";
std::cout << "\n";
}
found = true;
return;
}
// 尝试所有可能的列
for (int col = 0; col < n; ++col) {
if (is_safe(row, col, board)) {
board[row][col] = 1; // 放置皇后
// 继续向下一层搜索
solveNQueens(n, row+1, board, found);
// 当前解决方案无效,回溯并尝试下一个位置
board[row][col] = 0; // 移除皇后
}
}
}
int main() {
int n = 8;
std::vector<std::vector<int>> board(n, std::vector<int>(n, 0));
bool found = false;
solveNQueens(n, 0, board, found);
if (!found) std::cout << "No solution exists.\n";
return 0;
}
```
这个程序首先定义了一个`is_safe`函数用于检查当前位置是否安全,然后在`solveNQueens`函数中进行递归搜索。当找到解决方案时,`found`变量会被设置为`true`,程序会输出所有的皇后布局。
阅读全文