面試題12 13是接連的兩道回溯法的題。
先上定義:
回溯法的基本行為是搜尋,搜尋過程使用剪枝函式來為了避免無效的搜尋。剪枝函式包括兩類:1.使用約束函式,剪去不滿足約束條件的路徑;2.使用限界函式,剪去不能得到最優解的路徑。
回溯法說白了就是遞迴,遞迴法演算法簡潔且執行效率高,但是與之相應的就是遞迴法一般都很抽象,很難想。
回溯法的經驗小結:
出口: 出口就是判定條件,一般放在**第一行,這樣執行到終止條件的遞迴函式可以優先判定,避免有一些條件,內容的更改。
for index in range(nums):
flag = conflict(queen_str, index)
# 如果當前位置的皇后是否與之前所有位置的皇后沒有衝突,則執行下述**
if flag is false:
queen_str = queen_str+str(index)
back(queen_str )
如下可:
for index in range(nums):
flag = conflict(queen_str, index)
# 如果當前位置的皇后是否與之前所有位置的皇后沒有衝突,則執行下述**
if flag is false:
back(queen_str+str(index))
典型例題:
劍指offer上的面試題12:請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3×4的矩陣中包含一條字串「bfce」的路徑(路徑中的字母用加粗標出)。
[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]
但矩陣中不包含字串「abfb」的路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。
演算法設計很考究。
class solution
} return false;
}bool dfs(int i,int j,vector>& board,string word,int k)
};
劍指offer 回溯法
面試題12 矩陣中的路徑 上下左右遞迴,在看邊界條件 include includeusing namespace std 遞迴 bool haspathcore char m,int row,int col,int i,int j,const char str,int pathlen,bool v...
劍指offer 回溯法
題目描述 請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 矩陣中包含一條字串 bcced 的路徑,但是矩陣中不包含...
劍指offer 學習筆記 回溯法
回溯法可以看成蠻力法的公升級版,它從解決問題的每一步的所有可能選項裡系統地選擇乙個可行的解決方案。回溯法適合由多個步驟組成的問題,並且每個步驟有多個選項。用回溯法解決的問題的所有選項可以用樹狀結構形象地表示,在某一步有n個可能的選項,那麼該步驟可以看做樹狀結構中的乙個節點,每個選項看成樹中節點連線線...