位運算 巧用之 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 表示下一行中受到皇后攻擊的位置
讀懂騷操作 和思想