標籤:python 八皇后
八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n×n,而皇后個數也變成n。若且唯若 n = 1 或 n ≥ 4 時問題有解。
具體可以參考:https://github.com/chenqiangzhishen/Python/blob/master/pythonAlgorithms/eightQueens.py
代碼參考《python編程基礎》
import random#衝突檢查,在定義state時,採用state來標誌每個皇后的位置,其中索引用來表示橫座標,基對應的值表示縱座標,例如: state[0]=3,表示該皇后位於第1行的第4列上def conflict(state, nextX): nextY = len(state) for i in range(nextY): #如果下一個皇后的位置與當前的皇后位置相鄰(包括上下,左右)或在同一對角線上,則說明有衝突,需要重新擺放 if abs(state[i]-nextX) in (0, nextY-i): return True return False#採用產生器的方式來產生每一個皇后的位置,並用遞迴來實現下一個皇后的位置。def queens(num, state=()): for pos in range(num): if not conflict(state, pos): #產生當前皇后的位置資訊 if len(state) == num-1: yield (pos, ) #否則,把當前皇后的位置資訊,添加到狀態列表裡,並傳遞給下一皇后。 else: for result in queens(num, state+(pos,)): yield (pos, ) + result#為了直觀表現棋盤,用X表示每個皇后的位置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__": prettyprint(random.choice(list(queens(8))))
最後隨機列印出符合規則的皇后如下所示:
八皇后問題python實現