標籤:pos als 曆史 random length format 對比 coding solution
# -*- coding=utf-8 -*-‘‘‘@Desc: 八皇后演算法,python實現@Date: 2017-10-13@Author: HenryWang‘‘‘import random# 八皇后問題的前情不在此重複說明# 驗證新的皇后是否和之前的皇后所在位置有衝突:在同一列或者在對角線上# state 為已經確定的皇后的位置元組# nextX 為新的一個皇后的所在列的位置def conflict(state, nextX): nextY = len(state) # 新的皇后所在行 for i in range(len(state)): # 針對之前所有的皇后來判斷 # state[i]為第 i 行的皇后的所在列的位置 # 如果 state[i] - nextX == 0,那麼新的皇后和所對比的皇后在同一列,返回對比結果為True # 如果 abs(state[i] - nextX) == nextY - i ,那麼新的皇后和所對比的皇后在對角線上,返回對比結果為True if abs(state[i]-nextX) in (0, nextY-i): return True # 如果新的皇后和所有曆史皇后都不在同一列或者對角線上,返回對比記過為false return False# 產生皇后元組,預設皇后元組為空白def queens(num, state=()): # 針對所有的皇后所在的行,判斷每一列位置,0 - 7 for pos in range(num): # 調用皇后位置衝突驗證方法 if not conflict(state, pos): # 如果已經是最後一個皇后了,就yield這個皇后的位置 if len(state) == num-1: yield (pos, ) else: # 如果當前位置可以放皇后,那麼就繼續找到下一個適合位置的皇后,直到遞迴找到所有皇后的位置 for result in queens(num, state+(pos,)): yield (pos, ) + result# 漂亮的列印方法def prettyprint(solution): def line(pos, length=len(solution)): # 每一行,皇后所在位置列印 X,其他位置列印 . return ‘. ‘ * (pos) + ‘X ‘ + ‘. ‘ * (length-pos-1) # 針對每一個皇后所在的行都進行列印 for pos in solution: print(line(pos))if __name__ == ‘__main__‘: print(‘一共有 {} 種可能的皇后排放位置選擇‘.format(len(list(queens(8))))) print(‘其中一種選擇是:‘) prettyprint(random.choice(list(queens(8))))
python基礎查漏補缺7--八皇后問題