Leet Code 052-N皇后的位运算解法

位运算 巧用之 N-Queens

读懂代码备注即可

class Solution:

    def totalNQueens(self, n):
        if n < 1: return []
        self.cnt = 0
        self.dfs(n, 0, 0, 0, 0)
#         位运算,0表示安全,1表示可受到攻击
        return self.cnt

    def dfs(self, n, row, cols, pie, na):
#         recursion terminator
        if row >= n:
            self.cnt += 1
            return
        status = (~(cols | pie | na) & (1 << n) -1)  # 通过位运算得到当前的空位
        # cols | pie | na 通过 or 操作得到目前所有列的状态, 再取反,用 1 表示安全的列
        # (1 << n) -1) 得到低 n 位全 1 ,高位为 0 ,  and 操作过滤掉高位 只取低 n 位

        while status:
            bit = status & -status  # 位运算得到最低位的1  即当前行可放皇后的位置
            status = status & (status-1)  # 去掉最低位的1 即表示在 p 位置放置皇后,更新status
            self.dfs(n, row+1, cols|bit, (pie|bit)<<1, (na|bit)>>1)
            # 进行下一层 dfs, cols|p 更新列状态
            # (pie|p)<<1 和 (na|p)>>1 表示下一行中受到皇后攻击的位置
            

读懂骚操作 和思想

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章