n皇后问题,不用递归

注释如下:

class Solution:
    def totalNQueens(self, n: int) -> int:
        if n < 1:  # 如果 n 小于 1,直接返回 0
            return 0
        count = 0  # 初始化解的个数为 0
        stack = [(0, set(), set(), set())]  # 初始化一个栈,元素为当前处理的行数、已经放置皇后的列数、左上到右下的对角线和、右上到左下的对角线和
        while stack:  # 如果栈不为空
            row, cols, xy_diff, xy_sum = stack.pop()  # 取出栈顶元素
            if row == n:  # 如果已经处理完 n 行,解的个数加 1,继续处理下一个
                count += 1
                continue
            for 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  # 返回解的个数

算法步骤:

  1. 如果输入的 n 小于 1,则直接返回 0;
  2. 初始化解的个数为 0,初始化一个栈,元素为当前处理的行数、已经放置皇后的列数、左上到右下的对角线和、右上到左下的对角线和;
  3. 当栈不为空时,取出栈顶元素,如果已经处理完 n 行,解的个数加 1,继续处理下一个;
  4. 遍历当前行的每一列,如果当前列已经被占据,或者在左上到右下的对角线或右上到左下的对角线上,则跳过这一列;
  5. 否则,将当前行数加一、已占据列数加上当前列、左上到右下的对角线和加上当前元素、右上到左下的对角线和加上当前元素的元组入栈;
  6. 返回解的个数。

你可能感兴趣的:(算法)