Python递归实现n皇后问题

2023-04-16 00:00:00 python 递归 皇后

N 皇后问题是指在n×n的棋盘上放置n个皇后,使得皇后之间互相不能攻击到,即任意两个皇后不在同一行、同一列和同一对角线上。

Python递归实现N皇后问题的关键是如何表示棋盘上的棋子位置,并且如何在递归过程中不断更新棋盘状态。一般使用一个数组chessboard表示棋盘,chessboard[i]表示第i行的皇后所在列的位置。初始时,chessboard中所有的值都为-1,表示棋盘上没有皇后。

具体的递归实现如下:

def solveNQueens(n):
    # 初始化棋盘
    chessboard = [-1] * n
    # 定义 check 函数,判断当前位置是否可放置皇后
    def check(row, col):
        for i in range(row):
            if chessboard[i] == col or \
                abs(row - i) == abs(col - chessboard[i]):
                return False
        return True
    # 定义 backtrack 函数,检查每一行可行的位置,并递归搜索下一行
    def backtrack(row):
        if row == n:
            # 找到一组解法
            res.append(chessboard[:])
            return
        for col in range(n):
            if check(row, col):
                chessboard[row] = col
                backtrack(row+1)
                chessboard[row] = -1
    # 执行回溯算法
    res = []
    backtrack(0)
    # 格式化输出结果
    result = []
    for sol in res:
        cur_res = []
        for i in range(n):
            row_res = "." * sol[i] + "Q" + "." * (n - sol[i] - 1)
            cur_res.append(row_res)
        result.append(cur_res)
    return result

可以通过调用solveNQueens(n)函数来求解n皇后问题。函数中check函数用于判断每个格子是否可行,如果可行,则将当前皇后放到这个位置。backtrack函数则是递归实现搜索整个棋盘,每次搜索下一行可行的位置。当递归深度到达n时,说明已经找到一组解法。

最后通过格式化输出,将结果格式化为标准的矩阵输出。

相关文章