算法不难理解,主要是巧妙得利用位运算来消除无效运算,值得学习 #include <iostream> using namespace std; int sum; int upperlim; void dfs(int row, int ld, int rd) { if (row == upperlim) { sum++; return; } int pos = upperlim & ~(row | ld | rd); while (pos) { int p = pos & -pos; pos -= p; dfs(row + p, (ld + p) << 1, (rd + p) >> 1); } } int main() { int n = 0; cin >> n; if(n < 1 || n > 32) { return 0; } upperlim = (1 << n) - 1; sum = 0; dfs(0, 0, 0); cout << sum << endl; }