#include <vector>
#include <iostream>
// 第k行的位置是否有效
bool isValid(std::vector<int>& p, int k) {
if (k > p.size() - 1) return false;
for (size_t i = 0; i != k; ++i) {
if ((p[k] == p[i]) || (abs(p[k] - p[i]) == k - i))
return false;
}
return true;
}
// 递归
void reSolve(std::vector<int>& p, int k, int& cnt) {
size_t n = p.size();
if (k == n) {
++cnt;
return;
}
for (int i = 0; i != n; ++i) {
p[k] = i;
if (isValid(p, k)) reSolve(p, k + 1, cnt);
}
}
// 迭代
int isSolve(size_t n) {
std::vector<int> p(n, -1);
int cnt = 0;
int k = 0;
while (k >= 0) {
++p[k];
while (p[k] < n && !isValid(p, k)) { ++p[k]; }
if (p[k] >= n) --k;
else if (k == n - 1) ++cnt;
else p[++k] = -1;
}
return cnt;
}
int main() {
int num = 0;
int num2 = 0;
std::vector<int> p(8, 0);
reSolve(p, 0, num);
std::cout << num << std::endl;
std::cout << isSolve(8);
}
参考知乎@子飞