#include<iostream>
#include<stdio.h>
#include<cmath>
#include<vector>
using namespace std;
void dfs(vector<int>& queen, bool used[]) {
// 形成了一个解法,输出答案。
if (queen.size() == 8) {
for (int i = 0; i < 7; i++)
printf("%d ", queen[i]);
printf("%d\n", queen[7]);
return;
}
for (int i = 1; i <= 8; i++) {
// 如果该列数已经用过,则跳过
if (used[i])
continue;
// 判断该列如果放置皇后,对角线是否形成攻击
bool diagonalOK = true;
// 遍历当前已放置了皇后的位置j
for (int j = 0; j < queen.size(); j++) {
// A、B两个位置,如果A与B的行数之差,等于A与B的列数之差,则A与B一定在一条对角线上
// queen.size() - j是两个位置的行数之差,abs(i - queen[j])是两个位置的列数之差
if (queen.size() - j == abs(i - queen[j])) {
diagonalOK = false;
break;
}
}
// 深搜与回溯
if (diagonalOK) {
queen.push_back(i);
used[i] = true;
dfs(queen, used);
queen.pop_back();
used[i] = false;
}
}
}
int main() {
vector<int> queen; // 存储解法的容器
bool used[9] = {0}; // 标记列数是否已用过(1~8)
dfs(queen, used);
return 0;
}