回溯算法——LeetCode刷题——【51. N 皇后】

题目描述:

在这里插入图片描述

思路:

(1)初始化棋盘
(2)从上到下,逐行开始尝试
(3)尝试棋盘中每行的每一个位置,如果放置之后发生“冲突”(前面行中放置的皇后,和该位置在同一行、同一列或者同一对角线上),则进行剪枝
(4)如果没有发生“冲突”,则处理该位置(用"Q"覆盖"."),进入下一行的递归
(5)回溯,回到上一行

代码和注释:

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        # 初始化棋盘
        board = [['.'] * n for _ in range(n)]
        res = []

        # 表示board中小于row的那些行(row上面的那些行)已经放置皇后了
        # 这一步开始往第row行放皇后
        def backtrack(row):
            n = len(board)
            # 如果到最后一行了,则将结果添加到res里
            if row == n:
                tmp = [''.join(i) for i in board]
                res.append(tmp)
                return

            for col in range(n):
                if not self.isValid(board, row, col):
                    continue
                # 该处放置皇后
                board[row][col] = 'Q'
                # 递归
                backtrack(row + 1)
                # 回溯
                board[row][col] = '.'
        # 调用
        backtrack(0)

        return res 

            

    # 查看是否可以在board[row][col]的位置放置皇后
    def isValid(self, board, row, col):
        n = len(board)
        
        # 查看上方是否有Q
        for i in range(row):
            if board[i][col] == 'Q':
                return False

        # 查看右上方是否有Q
        for i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):
            if board[i][j] == 'Q':
                return False
        
        # 查看左上方是否有Q
        for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):
            if board[i][j] == 'Q':
                return False
        
        return True 

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Elon15/article/details/128294343