請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。 例如如下矩陣中包含一條字串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入該格仔。思路:可以用回溯法來解決的典型問題。
回溯法:回溯法可以看成蠻力法的公升級版,它從解決問題的每一步的所有可能選項裡系統地選擇乙個可行的解決方案。回溯法非常適合由多個步驟組成的問題,並且每個步驟都有多個選項。當我們在某一步選擇了其中乙個選項時,就進入下一步,然後又面臨新的選項。就這樣重複選擇,直到到達最終的狀態。首先在矩陣中任意選取乙個格仔作為起點。假設矩陣中某個格仔的字元為ch,並且這個格仔對應於路徑上的第i個字元。如果路徑上的第i個字元不是ch,那麼這個格仔不可能處在路徑的第i個位置上。如果路徑的第i個字元恰好是ch,那麼到相鄰的格仔上尋找第i+1個字元。重複這個過程直到路徑上的所有字元都在矩陣中找到相應的位置。由於回溯法的遞迴特性,路徑可以被看做乙個棧。用回溯法解決的問題的所有選項可以形象的用樹狀結構表示。在某一步有n個可能的選項,那麼該步驟可以看做是樹狀結構中的乙個節點,每個選項看成樹中節點連線線,經過這些連線線到達該節點的n個子節點。樹的葉子節點對應著終結狀態。如果樹的葉節點滿足題目的約束條件,那麼我們就找到了乙個可行的解決方案。
如果葉節點的狀態不滿足約束條件,那麼只好回溯到它的上乙個節點再嘗試其他的選項。如果上乙個節點的所有可能選項都已經試過了,並且不能到達滿足約束條件的終結狀態。則再次回溯到上乙個節點。
解題注意事項:
1.應該有乙個布林值矩陣來記錄矩陣的哪些格仔已經被使用過了
2.使用遞迴的方式求解。在使用遞迴的時候應該注意,在退出遞迴的時候需要根據需求對計數或者標誌進行回退或者清除等操作。
c++
class
solution}}
free
(visited)
;return
false;}
bool
haspathcore
(const
char
*matrix,
int rows,
int cols,
int row,
int col,
const
char
*str,
int&pathlength,
bool
*visited)
}return resu;}}
;
參考
劍指offer 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 a b t g c f c s j d e h 矩陣中包含一條字串...
劍指offer 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則之後不能再次進入這個格仔。注意 樣例matrix a b c e s f c s a d e e...
劍指offer 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則之後不能再次進入這個格仔。注意 matrix a b c e s f c s a d e e s...