回溯之n皇后问题的python方法

解题思路
通过row的变化这一点,遍历树的深度的时候,索引变量是row,这里比较难想到
还有就是一般在终止条件if那里去剪枝,此题在回溯函数中就已经剪枝
‘’.join(i) for i in chessboard,通过这里来去掉引号,学到一招
其他和整体和回溯法的通解挺像的

代码有很多print帮助自己理解一些用法


class Solution:

    def __init__(self):
        self.res = []

    def solveNQueens(self, n: int):
        self.chessboard = [["." for _ in range(n)] for _ in range(n)]
        # print(self.chessboard)  # test code
        self.backtrack(0, n, self.chessboard)
        return self.res

    def isvalid(self, row, col, n, chessboard):
        # 每层遍历,行自然不重复.1.检查列
        for i in range(row):
            if chessboard[i][col] == 'Q':
                return False
        # 2.检查主对角线,行减法列加法,查看右上方是否有Q
        for i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):
            if chessboard[i][j] == 'Q':
                return False
        # 3.检查次对角线
        # 查看左上方是否有Q,行减法列减法
        for i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):
            if chessboard[i][j] == 'Q':
                return False
        return True

    def backtrack(self, row, n, chessboard):
        if row == n:
            # print(f"this is chessboard:{chessboard}")  # test code
            # tmp暂时存储整个棋盘,并且去掉每个引号
            tmp = [''.join(i)for i in chessboard]
            # print(f"this is tmp:{tmp}")  # test code
            self.res.append(tmp)
            return

        for col in range(n):
            if self.isvalid(row, col, n, chessboard):
                chessboard[row][col] = 'Q'
                self.backtrack(row + 1, n, chessboard)
                chessboard[row][col] = '.'
        return self.res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值