倒序法
solutions中的每一個元素都是一種解法
例如 (0, 4, 7, 5, 2, 6, 1, 3), 下標代表每一行,每一個元素代表當前皇后處於第幾列
N皇后成立的標誌是啥
宮格多大?依據是啥
# -*- coding:utf-8 -*-
# 衝突檢查,在定義state時,採用state來標誌每個皇后的位置,
def conflict(state, nextY):
nextX = len(state)
# print(nextX),
for i in range(nextX):
# 如果下一個皇后的位置與當前的皇后位置相鄰(包括上下,左右)或在同一對角線上,則說明有衝突,需要重新擺放
if abs(state[i] - nextY) in (0, nextX - i):
# 縱座標減去下一個皇后的縱座標的絕對值 處於 0到下一皇后橫座標減i則衝突
return True # 衝突
return False # 不衝突
def queens(num, state=()):
# num = 8
# print("%d "%len(state)),
for pos in range(num):
if not conflict(state, pos): # 如果沒有衝突
# 產生當前皇后的位置信息
if len(state) == num - 1: # 一般來說,應該是產生8個皇后,將其打印出來纔是,可這是隻有7個???
yield (pos,) # 生成元組
# 否則,把當前皇后的位置信息,添加到狀態列表裏,並傳遞給下一皇后。
else:
for result in queens(num, state + (pos,)): # 將符合條件的皇后位置加入state中
yield (pos,) + result
def prettyprint(solution):
def line(pos, length=len(solution)):
return '. ' * (pos) + 'X ' + '. ' * (length - pos - 1)
for pos in solution:
print(line(pos))
if __name__ == "__main__":
solutions = list(queens(4))
for i in solutions: # 打印所有的解法
print(i)
prettyprint(i)
print('*' * 100)
# prettyprint(random.choice(list(queens(8)))) # 可能有多種解法,展示其中一種解法