1. 程式人生 > >python基於右遞迴解決八皇后問題的方法

python基於右遞迴解決八皇后問題的方法

凡是線性回溯都可以歸結為右遞迴的形式,也即是二叉樹,因此對於只要求一個解的問題,採用右遞迴實現的程式要比回溯法要優美的多。
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]
#比回溯法容易多了吧