注释如下:
class Solution:def totalNQueens(self, n: int) -> int:if n < 1: # 如果 n 小于 1,直接返回 0return 0count = 0 # 初始化解的个数为 0stack = [(0, set(), set(), set())] # 初始化一个栈,元素为当前处理的行数、已经放置皇后的列数、左上到右下的对角线和、右上到左下的对角线和while stack: # 如果栈不为空row, cols, xy_diff, xy_sum = stack.pop() # 取出栈顶元素if row == n: # 如果已经处理完 n 行,解的个数加 1,继续处理下一个count += 1continuefor col in range(n): # 遍历当前行的每一列if col in cols or row - col in xy_diff or row + col in xy_sum: # 如果当前列已经被占据,或者在左上到右下的对角线或右上到左下的对角线上continue # 跳过这一列stack.append((row+1, cols | {col}, xy_diff | {row-col}, xy_sum | {row+col})) # 否则,将当前行数加一、已占据列数加上当前列、左上到右下的对角线和加上当前元素、右上到左下的对角线和加上当前元素的元组入栈return count # 返回解的个数
算法步骤:
- 如果输入的 n 小于 1,则直接返回 0;
- 初始化解的个数为 0,初始化一个栈,元素为当前处理的行数、已经放置皇后的列数、左上到右下的对角线和、右上到左下的对角线和;
- 当栈不为空时,取出栈顶元素,如果已经处理完 n 行,解的个数加 1,继续处理下一个;
- 遍历当前行的每一列,如果当前列已经被占据,或者在左上到右下的对角线或右上到左下的对角线上,则跳过这一列;
- 否则,将当前行数加一、已占据列数加上当前列、左上到右下的对角线和加上当前元素、右上到左下的对角线和加上当前元素的元组入栈;
- 返回解的个数。