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 表示下一行中受到皇后攻擊的位置
            

讀懂騷操作 和思想

在這裏插入圖片描述

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