凡是線性回溯都可以歸結為右遞迴的形式,也即是二叉樹,因此對於只要求乙個解的問題,採用右遞迴實現的程式要比回溯法要優美的多。
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]
#比回溯法容易多了吧
回溯法解決八皇問題
把八個皇后放在乙個8 8的棋盤上面,要求同一行 同一列 同一對角線不能有兩個皇后。思路 關鍵在於判定兩個皇后是否在同一行 同一列或同一對角線上。這裡,棋盤下標從1開始算起。觀察發現 若是在同一行,則行號相同 若在同一列,則列號相同 若在同一 對角線,則行列值之和相同 若是在同一 對角線,則行列值之差...
基於python解決漢諾塔問題(遞迴)
剛剛看了python的遞迴,實現了一下漢諾塔問題求解。mark一下,txtx。漢諾塔問題 解題思路 把n個圓盤看作兩部分 最底部的乙個圓盤和上面的n 1個圓盤 二分類 先將n 1個圓盤移到b柱 中轉 再將最底下的乙個圓盤移到c柱 目標 最後將n 1個圓盤移到c柱 目標 然後我們對n 1個圓盤做相似過...
遞迴解決經典八皇后問題
public class recursiontest 列印問題 public static void test int n else 階乘問題 public static intfactorial int n else 迷宮問題 迷宮問題,求初始點到終點的一條通路 不一定是最小通路!牆體設為1,路徑...