52. N皇后 II
题目描述
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 不同的解决方案的数量。
示例1:
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:1
提示:
- 1 ≤ n ≤ 9 1 \le n \le 9 1≤n≤9
- 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
题解:
参考 N皇后 ,两题基本一样,就是统计方案变成统计方案数量。
直接使用 究极优化 版本代码,又快又省(打表除外,那是开挂)。
class Solution {
public:
int goal;
void dfs( int row, int diag, int rdiag, int& cnt) {
if ( row == goal ) {
++cnt;
return;
}
int safe = goal & (~(row | diag | rdiag));
int nxt;
while ( safe ) {
nxt = safe & (~safe + 1);
safe ^= nxt;
dfs( row | nxt, (diag | nxt) << 1, (rdiag | nxt) >> 1, cnt );
}
}
int totalNQueens(int n) {
goal = (1 << n) - 1;
int cnt = 0;
dfs( 0, 0, 0, cnt );
return cnt;
}
};
/*
时间:0ms,击败:100.00%
内存:5.7MB,击败:99.39%
*/