問題
某樓梯有n層台階,每步只能走1級台階,或2級台階。從下向上爬樓梯,有多少種爬法?
分析這個問題之前用分治法解決過。但是,這裡我要用回溯法www.cppcns.com子集樹模板解決它。
祭出元素-狀態空間分析**:每一步是乙個元素,可走的步數[1,2]就是其狀態空間。不難看出,元素不固定,狀態空間固定。
直接上**。
**'''爬樓梯'''
n = 7 # 樓梯階數
x = # 乙個解(長度不固定,1-2陣列,表示該步走的台階數)
x = # 一組解
# 衝突檢測
def conflict(k):
global n, x, x
# 部分解步的步數之和超過總台階數
if sum(x[:k+1]) > n:
return true
return false # 無衝突
# 回溯法(遞迴版本)
def climb_stairs(k): # 走第k程式設計客棧步
global n, x, x
if sum(www.cppcns.comx) == n: # 已走的所有步數之和等於樓梯總台階數
print(x)
#x.append(x[:]) # 儲存(乙個解)
else:
for i in [1, 2]: # 第k步這個元素的狀態空間為[1,2]
x.append(i)
if not conflict(k): # 剪枝
climb_stairs(k+1)
x.pop() # 回溯
# 測試
climb_stairs(0) # 走第0步
效果圖
Python使用回溯法子集樹模板解決迷宮問題示例
問題 給定乙個迷宮,入口已知。問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。為方便起見,用1將迷宮圍起來避免邊界問題。分析考慮到左 右是相對的,因此修改為 北 東北 東 東南 南 西南 西 西北...
python 用回溯法(子集樹)解n皇后問題
n皇后問題 如何能夠在 n n 的西洋棋棋盤上放置n個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后。為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。def backtrack t,n 核心 if t n output return else for i in range n a t ...
Python 回溯法 子集樹模組系列 八皇后問題
案例 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n ...