python基於右遞迴解決八皇后問題的方法
阿新 • • 發佈:2019-02-14
凡是線性回溯都可以歸結為右遞迴的形式,也即是二叉樹,因此對於只要求一個解的問題,採用右遞迴實現的程式要比回溯法要優美的多。
def Test(queen,n): '''這個就不用說了吧,就是檢驗第n(下標,0-7)行皇后的位置是否合理''' q=queen for i in xrange(n): if queen[i]==q or queen[i]-q==n-i or queen[i]-q==i-n:return False return True def Settle(queen,n): '''這個負責安置第n(下標,0-7)行皇后,每次呼叫,皇后都至少會移動一步''' queen +=1 while queen <8 and not Test(queen,n):queen +=1 return queen <8 def Solve(queen,n): '''這個負責解決第n(下標,0-7)行皇后的安置以及隨後所有皇后的安置''' if n==8:#安置完所有皇后了,故輸出列表 print queen return True#如果設為假,則會嘗試所有的安置方案 else: queen =-1#初始化第n行皇后的起始位置(起始位置-1,可安置在0-7) while Settle(queen,n):#如果成功安置皇后 if Solve(queen,n+1):#安置其餘皇后 return True#成功安置,返回真 return False#失敗,返回假 if __name__=='__main__': Solve([-1 for i in range(8)],0)#列表的值可以隨便設定,因為會初始化 #雖然我們沒有進行回溯,但事實上,我們每一個引數相同的Solve函式都嘗試了多次 #輸出:[0, 4, 7, 5, 2, 6, 1, 3] #比回溯法容易多了吧