N皇后问题求解:Python代码实现

N皇后问题是一个经典的回溯算法问题,它要求将n个皇后放置在n×n的棋盘上,使得皇后彼此之间不能相互攻击。即任何两个皇后都不能处于同一行、同一列或同一对角线上。

本文将提供一个Python代码实现,并详细解释其工作原理。

算法思路

  1. 使用cols数组记录皇后位置: 我们使用一个长度为n的列表cols来记录每一行中皇后所在的列数。初始时,每行都没有皇后,即cols=[-1]*n。
  2. 递归枚举: 从第一行开始,依次枚举该行中每一列。如果该列已经有皇后了,就跳过;否则,我们就将该列作为该行皇后的位置,将cols数组中相应的位置更新为该列。
  3. 递归处理下一行: 递归处理下一行,直到最后一行处理完毕,我们就得到了一个合法的方案。
  4. 合法性判断: 在处理下一行时,我们需要先判断当前列是否可行(即cols中是否已经存在该列),如果存在就不能选择该列。其次,我们需要判断右上方和左上方是否存在皇后,如果存在也不能选择该列。这可以通过计算行号与列号之差或之和的值是否相等来判断。
  5. 方案转化: 当我们得到一个合法的方案时,我们将其转化为一个字符串列表,其中每个字符串表示一行,皇后所在的位置用'Q'表示,空位用'.'表示。
  6. 存储所有方案: 最后将所有合法方案存储在一个列表中,并返回该列表。

代码实现

import sys
from collections import deque

def solveNQueens(n: int) -> List[List[str]]:
    def is_valid(row, col):
        # 检查该列是否已经有皇后
        if cols[col] != -1:
            return False
        # 检查右上方和左上方是否存在皇后
        for i in range(row):
            if abs(row - i) == abs(col - cols[i]):
                return False
        return True

    def backtrack(row):
        if row == n:
            # 所有行都已放置皇后,得到一个合法方案
            solution = [['.'] * n for _ in range(n)]
            for i in range(n):
                solution[i][cols[i]] = 'Q'
            result.append([''.join(row) for row in solution])
            return

        # 尝试将皇后放置在该行的每一列
        for col in range(n):
            if is_valid(row, col):
                cols[col] = row
                backtrack(row + 1)
                cols[col] = -1  # 回溯,将该列恢复为初始状态

    result = []
    cols = [-1] * n
    backtrack(0)
    return result

if __name__ == '__main__':
    n = int(sys.stdin.readline().strip())
    print(solveNQueens(n))

代码解释

  1. solveNQueens(n: int) 函数: 该函数接受一个整数n作为参数,表示棋盘的大小。
  2. is_valid(row, col) 函数: 该函数用于判断将皇后放置在第row行第col列是否合法。
  3. backtrack(row) 函数: 该函数使用递归来尝试将皇后放置在每一行。
  4. result 列表: 用于存储所有合法的方案。
  5. cols 列表: 用于记录每一行皇后所在的列数。

示例

输入:4 输出:

[['.Q..', '...Q', 'Q...', '.Q..'], ['..Q.', 'Q...', '...Q', '.Q..']]

总结

本文介绍了如何使用Python代码解决N皇后问题,并提供了详细的算法解释和示例代码。该代码使用cols数组和递归来判断皇后放置的合法性,并将所有合法的方案存储在一个列表中,最终返回该列表。希望本文能够帮助您理解N皇后问题的求解过程和代码实现。

N皇后问题求解:Python代码实现

原文地址: http://www.cveoy.top/t/topic/m8TD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录