当前位置:   article > 正文

python实现经典的DFS算法-n皇后问题_n皇后问题 python

n皇后问题 python

题目描述:

在 n\times nn×n 的棋盘上放置 nn 个皇后,求所有的放置方法。

放置时要满足:任意两个皇后不能在同一行、同一列,也不能在同一条对角线上。

给定 nn,输出所有合法的放置方案。

输入格式

一个整数 nn。

输出格式

每个解占 nn 行,其中第 ii 行为皇后所在的列编号,按字典序从小到大输出所有的解,每个解之间要用一个空行隔开。

最后一行输出总方案数。

样例输入

4

样例输出

2 4 1 3 3 1 4 2

4 2 1 3 2 4 3 1

解析:

这道题是一个经典的 “八皇后问题”,它的思路是深度优先搜索 + 剪枝。

我们可以从第 11 行开始往下依次考虑放哪个位置的皇后,尝试将其放在 1\sim n1∼n 中的第 ii 列,并判断是否合法。若该位置合法,再考虑填下一行;若不合法则直接跳过这个位置。

在搜索时,我们需要维护三个状态:

  • cols[i] 表示第 i 行上哪一列有皇后
  • diagonal[i-j+n] 表示右上至左下的斜线上是否有皇后,其中 nn 为棋盘大小, ii 与 jj 是该位置的行列号。
  • anti_diagonal[i+j] 表示左上至右下的斜线上是否有皇后,其中 ii 与 jj 是该位置的行列号。

每次循环枚举的是 1\sim n1∼n 中的第 ii 列,如果在同一列(cols[i])或者对角线上(diagonal[i-j+n] 或 anti_diagonal[i+j])已经有了皇后,则直接跳过。否则就将当前位置标记为皇后,并更新三个状态的值,然后进入下一层递归搜索。

终止条件是当前搜索到了最后一行,即搜索到第 n+1n+1 行。

最后,我们统计合法解的数量,并输出所有合法方案。

详细python代码:

  1. def solveNQueens(n: int) -> List[List[str]]:
  2. def dfs(row):
  3. # 搜索到了第 n + 1 行,记录答案
  4. if row == n:
  5. res.append([''.join(s) for s in board])
  6. return
  7. for col in range(n):
  8. # 判断当前位置能否放置皇后
  9. if not cols[col] and not diagonal[row - col + n] and not anti_diagonal[row + col]:
  10. cols[col] = True
  11. diagonal[row - col + n] = True
  12. anti_diagonal[row + col] = True
  13. board[row][col] = 'Q'
  14. dfs(row + 1)
  15. cols[col] = False
  16. diagonal[row - col + n] = False
  17. anti_diagonal[row + col] = False
  18. board[row][col] = '.'
  19. res = []
  20. # 初始化棋盘为全空状态
  21. board = [['.' for _ in range(n)] for _ in range(n)]
  22. # 列
  23. cols = [False] * n
  24. # 右上至左下的斜线
  25. diagonal = [False] * (2 * n - 1)
  26. # 左上至右下的斜线
  27. anti_diagonal = [False] * (2 * n - 1)
  28. dfs(0)
  29. return res

其中,dfs 函数是核心搜索函数,其参数 row 表示当前正在搜索第几行。在搜索过程中,我们维护了四个状态:棋盘状态 board、列状态 cols、右上至左下的斜线状态 diagonal 和左上至右下的斜线状态 anti_diagonal。在搜索到第 n+1 行时,我们将当前棋盘状态加入到答案中。

主函数初始化了棋盘和四个状态,并从第 0 行开始调用 dfs 函数进行搜索,最终返回答案。

注意:本代码使用了 Python 中的 Type Hints,需要 Python 3.5 及以上版本才能运行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/64120
推荐阅读
相关标签
  

闽ICP备14008679号