八皇后问题
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 14;
int n;
bool visited[3][N*N]; // visited[0][i] 表示第i列 时候被占
// visited[1][x] 表示主对角线(左上到右下)是否被占,原理是 主对角线上 行号 - 列号是一个常数 (-7 到 7)
// visited[2][x] 表示副对角线(左上到右下)是否被占,原理是 副对角线上 行号 + 列号是一个常数 (0 到 14)
int C[N]; // 记录搜索路径
int total = 0; // 总解数
void search(int row) // 第几行
{
if (row == n) {
total++;
if (total < 4) { // 输出前三个解
for (int i = 0; i < n; i++) {
cout << C[i] + 1 << " ";
}
cout << endl;
}
return;
}
for (int i = 0; i < n; i++) {
if (!visited[0][i] && !visited[1][i - row + n] && !visited[2][row + i]) {
C[row] = i;
visited[0][i] = visited[1][i - row + n] = visited[2][row + i] = 1; // 标记这一列和两条对角线
search(row + 1);
visited[0][i] = visited[1][i - row + n] = visited[2][row + i] = 0; // 回溯,解除标记
}
}
}
int main()
{
cin >> n;
search(0);
cout << total;
return 0;
}