Python N皇后算法

遞歸法

  • 用一個一維N元數(shù)組來存放每一行皇后的位置,這樣就不存在行沖突了,只要判斷哪一列可以放置就可以了,如果找到一個可以放置皇后的位置j后,則會遞歸探測下一行,結束后則會繼續(xù)探測i行j+1列,故可以找到所有的N皇后的解。
class Solution:
    #最后mark數(shù)組里面標記的是皇后的位置,例如mark[0] = 2, 表示第一行皇后放在第3列的位置
    def make(self, mark):
        #初始化數(shù)組
        r = [['.' for _ in range(len(mark))] for _ in range(len(mark))]
        #將每一行中皇后的位置用‘Q’代替
        for i in mark:
            r[i][mark[i]] = 'Q'
        #枚舉,將原來散的元素連接成字符串
        for k, v in enumerate(r):
            r[k] = ''.join(v)
        return r

    #遞歸函數(shù),核心
    def recursive(self, mark, cur, ret):

        #如果當前行是最后一行,記錄一個解,并返回上一級調(diào)用,繼續(xù)探測
        if cur == len(mark):
            ret.append(self.make(mark))
            return

        #試探處理,將當前行的皇后應該在的位置遍歷每一列,如果滿足條件,遞歸調(diào)用處理下一行
        for i in range(len(mark)):
            mark[cur], down = i, True
            for j in range(cur):
                if mark[j] == i or abs(i-mark[j]) == cur - j:
                    down = False
                    break
            if down:
                self.recursive(mark, cur+1, ret)

    def solveNQueens(self, n):

        ret = []
        self.recursive([None]*n, 0, ret)
        return ret

enity = Solution()
print enity.solveNQueens(4)
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱為試探法,它并不考慮問題規(guī)模的大小,而是從問題的最明顯的最小規(guī)模開始逐步求解出可能的答案,并...
    fredal閱讀 13,992評論 0 89
  • 問題描述 n皇后問題是將n個皇后放置在n*n的棋盤上,皇后彼此之間不能相互攻擊(不同行,不同列,不同對角線)。給定...
    Alfie20閱讀 657評論 0 0
  • 這一天,所有的老鼠為它而瘋狂…… 下水道是城市的良心。這是長老跟我說的,但我并不能懂他這話是什么意思,長老也不期待...
    空瑾閱讀 372評論 0 0
  • 秋宵月色勝春宵,萬里霜天靜寂寥。 2016年8月,中國旗袍會煙臺聯(lián)合總會應邀煙臺電視臺外景拍攝,來到了美麗...
    漁知魚閱讀 850評論 0 1
  • 它們之間的主要區(qū)別在于Docker是一個在你的本機操作系統(tǒng)中運行的獨立進程,而虛擬機是一個完整的隔離操作系統(tǒng),它在...
    那個_夏天閱讀 601評論 0 0

友情鏈接更多精彩內(nèi)容