• n皇后问题,不用递归


    注释如下:

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

    算法步骤

    1. 如果输入的 n 小于 1,则直接返回 0;
    2. 初始化解的个数为 0,初始化一个栈,元素为当前处理的行数、已经放置皇后的列数、左上到右下的对角线和、右上到左下的对角线和;
    3. 当栈不为空时,取出栈顶元素,如果已经处理完 n 行,解的个数加 1,继续处理下一个;
    4. 遍历当前行的每一列,如果当前列已经被占据,或者在左上到右下的对角线或右上到左下的对角线上,则跳过这一列;
    5. 否则,将当前行数加一、已占据列数加上当前列、左上到右下的对角线和加上当前元素、右上到左下的对角线和加上当前元素的元组入栈;
    6. 返回解的个数。
  • 相关阅读:
    Acwing 286. 选课(背包类树形DP)
    VMware认证考试科目及课程内容
    java面试强基(14)
    Git - 版本控制系统
    07.Octave语言的使用-变量、数值、向量、矩阵
    计算机毕业设计springboot+vue文体用品商城网站
    CompletableFuture和ListenableFuture
    使用docker搭建GitLab个人开发项目私服
    Python 超高频常见字符操作【建议收藏】
    html页面提交数据后,数据库有新增但为空值
  • 原文地址:https://blog.csdn.net/u012632105/article/details/133983029