今天重温八皇后!可以是回溯题必做,算法小白头疼!https://www.luogu.com.cn/problem/P1219
这题是简化版!
cpp#include <iostream>
using namespace std;
const int MAXN = 13;
int n;
int queens[MAXN]; // queens[i] 表示第 i 行的棋子放在第 queens[i] 列
bool columns[MAXN], diag1[2 * MAXN - 1], diag2[2 * MAXN - 1];
int solutionCount = 0;
void printSolution() {
for (int i = 0; i < n; ++i) {
cout << queens[i] + 1 << " ";
}
cout << endl;
}
void solve(int row) {
if (row == n) {
// 找到一个解
solutionCount++;
if (solutionCount <= 3) {
printSolution();
}
return;
}
for (int col = 0; col < n; ++col) {
if (!columns[col] && !diag1[row + col] && !diag2[row - col + n - 1]) {
// 放置棋子
queens[row] = col;
columns[col] = diag1[row + col] = diag2[row - col + n - 1] = true;
// 递归下一行
solve(row + 1);
// 回溯
columns[col] = diag1[row + col] = diag2[row - col + n - 1] = false;
}
}
}
int main() {
cin >> n;
// 初始化
for (int i = 0; i < n; ++i) {
columns[i] = false;
}
for (int i = 0; i < 2 * n - 1; ++i) {
diag1[i] = diag2[i] = false;
}
// 从第 0 行开始搜索
solve(0);
// 输出解的总数
cout << solutionCount << endl;
return 0;
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!