n皇后问题,不用递归

编程入门 行业动态 更新时间:2024-10-23 11:32:48

n皇后问题,不用<a href=https://www.elefans.com/category/jswz/34/1771140.html style=递归"/>

n皇后问题,不用递归

注释如下:

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  # 返回解的个数

算法步骤:

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

更多推荐

n皇后问题,不用递归

本文发布于:2023-12-04 20:29:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662129.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:递归   皇后

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!