用c++求解n皇后问题
时间: 2023-08-04 20:26:34 浏览: 117
c++解决n皇后问题
n皇后问题是一道经典的回溯算法问题,以下是C++的实现代码:
```
#include <iostream>
#include <vector>
using namespace std;
// 判断当前位置是否可以放置皇后
bool is_valid(vector<int>& queens, int row, int col) {
for(int i = 0; i < row; i++) {
if(queens[i] == col || abs(row - i) == abs(col - queens[i])) {
return false;
}
}
return true;
}
// 递归回溯求解n皇后问题
void backtrack(vector<vector<string>>& res, vector<int>& queens, int row, int n) {
if(row == n) {
vector<string> solution(n, string(n, '.'));
for(int i = 0; i < n; i++) {
solution[i][queens[i]] = 'Q';
}
res.push_back(solution);
} else {
for(int col = 0; col < n; col++) {
if(is_valid(queens, row, col)) {
queens[row] = col;
backtrack(res, queens, row + 1, n);
queens[row] = -1;
}
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> queens(n, -1);
backtrack(res, queens, 0, n);
return res;
}
int main() {
int n = 4;
vector<vector<string>> res = solveNQueens(n);
for(int i = 0; i < res.size(); i++) {
for(int j = 0; j < res[i].size(); j++) {
cout << res[i][j] << endl;
}
cout << endl;
}
return 0;
}
```
代码思路:
1. 递归函数 backtrack 用于求解 n 皇后问题,参数 res 表示最终结果,queens 表示每一行皇后所在的列号,row 表示当前处理的行号,n 表示总行数。
2. 判断当前位置是否可以放置皇后的函数 is_valid,用于判断当前位置是否会受到之前皇后的攻击,如果是则返回 false。
3. 在 backtrack 函数中,先判断是否已经处理完了所有行,如果是则将结果加入到 res 中,否则枚举当前行的所有列,如果当前位置可以放置皇后,则继续处理下一行。
4. 主函数中调用 solveNQueens 函数求解 n 皇后问题,并输出结果。
阅读全文