https://cn.bing.com/search?q=8+queens+92

 1 # -*- coding: gbk -*-
 2 # 把棋盘看成8根木条。判断斜线时滑动木条。
 3 mask = list(map(lambda n:1<<n, range(15, 7, -1)))
 4 b = 8 * [0]; cnt = 0
 5 def print_brd():
 6     for y in range(8):
 7         line = b[y]
 8         for m in mask: print(' ' + ('Q' if line & m else '.'), end='')
 9         print('')
10 def fighting(cy): # cy: current y
11     if cy == 0: return 0
12     r = range(cy)
13     for y in r:
14         if b[y] & b[cy]: return 1
15         if (b[y] << y) & (b[cy] << cy): return 1
16         if (b[y] >> y) & (b[cy] >> cy): return 1
17     return 0
18 def search(y):
19     global cnt
20     if y == 8:
21         cnt += 1
22         if cnt == 1: print_brd()
23         return
24     for x in range(8):
25         b[y] |= mask[x]
26         if not fighting(y): search(y + 1)
27         b[y] &= ~mask[x]
28 
29 search(0); print('\n', cnt, 'solutions')

背包:

 1 # -*- coding: gbk -*-
 2 # 每件物品带个开关。1:放入背包,0:不放。
 3 w = [ 5, 3, 7, 1] # weight of 物品
 4 n = len(w)
 5 m = list(map(lambda n:1<<n, range(n))) # mask
 6 for bits in range(1 << n):
 7     t = []
 8     for i in range(n):
 9         if bits & i: t.append(w[i])
10     print(t)
posted on 2021-12-01 15:27  华容道专家  阅读(52)  评论(0)    收藏  举报