N皇后问题
题目描述
N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列也不再同一条斜线上,求给一个整数n,返回n皇后的摆法。
输入描述:
输出一个整数,代表 n ( 1 ≤ n ≤ 14 ) n(1 \leq n \leq 14 ) n(1≤n≤14)。
输出描述:
输出一个整数,代表n皇后的种数。
示例1
输入
1
输出
1
示例2
输入
8
输出
92
备注:
时间复杂度 O ( 2 n ) O(2^n) O(2n),空间复杂度 O ( 1 ) O(1) O(1) 。
题解:
参考自:八皇后位运算,讲解的非常详细。
代码:
#include <cstdio>
using namespace std;
int n;
int ret;
int goal;
void dfs(int row, int diag, int rdiag) {
int safe, nxt;
if (row != goal) {
safe = goal & (~(row | diag | rdiag));
while (safe) {
nxt = safe & (~safe + 1);
safe ^= nxt;
dfs((row | nxt), (diag | nxt) << 1, (rdiag | nxt) >> 1);
}
} else ++ret;
}
int main(void) {
scanf("%d", &n);
goal = (1 << n) - 1;
dfs(0, 0, 0);
printf("%d\n", ret);
return 0;
}