加载中...
52-N皇后 II(N-Queens II)
发表于:2021-12-03 | 分类: 困难
字数统计: 204 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/n-queens-ii

英文原文

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n, return the number of distinct solutions to the n-queens puzzle.

 

Example 1:

Input: n = 4
Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown.

Example 2:

Input: n = 1
Output: 1

 

Constraints:

  • 1 <= n <= 9

中文题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

 

示例 1:

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:1

 

提示:

  • 1 <= n <= 9
  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

通过代码

高赞题解

解题思路:

这个解法非常经典,所以我觉得应该放到题解里面,核心思路是这样:

  1. 使用常规深度优先一层层搜索
  2. 使用三个整形分别标记每一层哪些格子可以放置皇后,这三个整形分别代表列、左斜下、右斜下(_col, ld, rd_),二进制位为 $1$ 代表不能放置,$0$ 代表可以放置
  3. 核心两个位运算:
    1. x & -x 代表除最后一位 $1$ 保留,其它位全部为 $0$
    2. x & (x - 1) 代表将最后一位 $1$ 变成 $0$

代码:

[]
class Solution { public: int totalNQueens(int n) { dfs(n, 0, 0, 0, 0); return this->res; } void dfs(int n, int row, int col, int ld, int rd) { if (row >= n) { res++; return; } // 将所有能放置 Q 的位置由 0 变成 1,以便进行后续的位遍历 int bits = ~(col | ld | rd) & ((1 << n) - 1); while (bits > 0) { int pick = bits & -bits; // 注: x & -x dfs(n, row + 1, col | pick, (ld | pick) << 1, (rd | pick) >> 1); bits &= bits - 1; // 注: x & (x - 1) } } private: int res = 0; };

统计信息

通过次数 提交次数 AC比率
78268 95244 82.2%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
N 皇后 困难
上一篇:
51-N 皇后(N-Queens)
下一篇:
54-螺旋矩阵(Spiral Matrix)
本文目录
本文目录