N 皇后问题

求N皇后有多少种摆放方案,记录列和2条对角线的forbidden的信息。对于N比较小的时候可以利用位运算加速。只要找一组解的话,有直接构造方法。

#include using namespace std; int all, ans; void run(int row, int ld, int rd) { if (row == all) { ans++; return; } int pos, p; pos = all & ~(row | ld | rd); while (pos) { p = pos & -pos; pos ^= p; run(row ^ p, (ld ^ p) << 1, (rd ^ p) >> 1); } } void find_instance(int n) { int i, j; if (n == 1) { puts("1 1"); return; } if ((n / 2) % 3 != 1) { puts("1 2"); j = 2; for (i = 4; i <= n; i += 2) printf("%d %d/n", j++, i); for (i = 1; i <= n; i += 2) printf("%d %d/n", j++, i); } else { bool odd = true; if (n & 1) n--; else odd = false; printf("%d %d/n", 1, n / 2); j = 2; for (i = n / 2 + 1; i != n / 2 - 1; i = (i + 2) % n) printf("%d %d/n", j++, i + 1); for (i = (i + n - 2) % n; i != n / 2 - 1; i = (i + n - 2) % n) printf("%d %d/n", j++, n - i); printf("%d %d/n", j++, n - i); if (odd) printf("%d %d/n", j++, n + 1); } } int main() { int n; scanf("%d", &n); all = (1 << n) - 1; ans = 0; run(0, 0, 0); printf("%d/n", ans); if (ans) find_instance(n); return 0; }

你可能感兴趣的:(N 皇后问题)