#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;
}