4 皇后有几个解
4×4 的棋盘上放 4 个互不攻击的皇后。运行下面这段程序:
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Stat {
int c = 0; // 找到几个解
int v = 0; // 走过几个结点
};
bool queen_ok(const vector<int>& col, int c) {
int r = (int)col.size();
for (int i = 0; i < r; i++) {
if (col[i] == c || abs(col[i] - c) == r - i) return false;
}
return true;
}
void queens_dfs(int n, vector<int>& col, Stat& st) {
st.v++;
if ((int)col.size() == n) {
st.c++;
return;
}
for (int c = 0; c < n; c++) {
if (!queen_ok(col, c)) continue;
col.push_back(c);
queens_dfs(n, col, st);
col.pop_back();
}
}
Stat queens(int n) {
Stat st;
vector<int> col;
queens_dfs(n, col, st);
return st;
}
int main() {
cout << queens(4).c << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)
全部评论