Python 實現八皇后問題

原文鏈接:https://blog.csdn.net/qianggezhishen/article/details/46536605

八皇后問題是一個以國際象棋爲背景的問題:如何能夠在 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))))

最後隨機打印出符合規則的皇后如下所示:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章