八皇后問題python實現

來源:互聯網
上載者:User

標籤: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實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.