八皇后II

用一个数组state记录已经选择的每一行皇后所在的位置,DFS

 1 count = 0
 2 N = 8
 3 state = [0]*N
 4 
 5 def dfs(row):
 6     global count
 7     for col in range(N):
 8         for i in range(row):
 9             if col == state[i] or abs(i-row) == abs(col-state[i]):
10                 break
11         else:
12             if row == N-1:
13                 count += 1
14             else:
15                 state[row] = col
16                 dfs(row+1)
17 
18 dfs(0)
19 print(count)

在整数shu,pie,na中用每个bit位记录已经被占用的 竖,撇,捺

 1 count, N, pie, na, shu = 0, 8, 0, 0, 0
 2 
 3 def dfs(row):
 4     global count, pie, na, shu
 5     for col in range(N):
 6         j, i = row+col, N-1-row+col
 7         #验证此位置是否可行
 8         if not ((shu >> col) | (pie >> j) | (na >> i)) & 1:
 9             if row == N-1:
10                 count += 1
11             else:
12                 #记录此位置
13                 shu ^= (1 << col); pie ^= (1 << j); na ^= (1 << i)
14                 dfs(row+1)
15                 #清除此位置信息
16                 shu ^= (1 << col); pie ^= (1 << j); na ^= (1 << i)
17 
18 if __name__ == '__main__':
19     dfs(0)
20     print(count)

 

posted @ 2017-03-12 17:56  wilderness  阅读(163)  评论(0编辑  收藏  举报