c++解决n皇后问题的实现,n可以由键盘输入
时间: 2024-12-10 16:49:03 浏览: 38
在C++中,解决n皇后问题通常会采用回溯法(Backtracking)。这是一个经典的递归算法,用于在一个有约束的棋盘上放置n个皇后,使得任意两个皇后都不会在同一行、同一列或对角线上。以下是简单的回溯算法步骤:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 定义一个函数来检查是否可以在当前位置放置皇后
bool isSafe(vector<vector<int>>& board, int row, int col) {
// 检查行冲突
for (int i = 0; i < col; ++i)
if (board[row][i] == 1)
return false;
// 检查左上方对角线冲突
int di = row - col;
for (int i = 0; i <= di; ++i)
if (board[i][col-i] == 1)
return false;
// 检查右上方对角线冲突
di = row + col;
for (int i = 0; i < di; ++i)
if (board[di-i][col-i] == 1)
return false;
return true;
}
// 回溯函数
void solveNQueens(int n, vector<vector<int>>& board, int row) {
if (row == n) {
// 打印解决方案
for (auto& row : board)
for (int cell : row)
cout << cell << " ";
cout << endl;
return;
}
for (int col = 0; col < n; ++col) {
if (isSafe(board, row, col)) {
// 将皇后放在当前位置
board[row][col] = 1;
// 继续在下一行尝试
solveNQueens(n, board, row+1);
// 如果当前路径无效,回溯到上一步
board[row][col] = 0;
}
}
}
int main() {
int n;
cout << "请输入皇后数量n: ";
cin >> n;
vector<vector<int>> board(n, vector<int>(n, 0));
solveNQueens(n, board, 0);
return 0;
}
```
阅读全文