筆記 回溯法

2021-10-23 13:41:45 字數 1275 閱讀 3882

回溯法可以看成蠻力法的公升級版,他從解決問題每一步的所有可能選項裡系統地選擇出乙個可行的解決方案。回溯法適合由多個步驟組成的問題,並且每個步驟都有多個選項。當我們在某一步選擇了其中乙個選項時,就進入下一步,然後又面臨新的選項。重複選擇,直至到達最終的狀態。

用回溯法解決的問題的所有選項可以形象地用樹狀結構表示。在某一步有n個可能的選項,那麼該步驟可以看成是樹狀結構中的乙個節點,每個選項看成樹中節點連線線,經過這些連線線到達該節點的n個子節點。樹的葉節點對應著終結狀態。如果在葉節點的狀態滿足題目的約束條件,那麼找到了乙個可行的解決方案。

如果葉節點的狀態不滿足約束條件,那麼只好回溯到它的上乙個節點再嘗試其他的選項。如果上乙個節點所有可能選項都已試過,並且不能到達滿足約束條件的終結狀態,則再次回溯到上乙個節點。如果所有節點的所有選項都已嘗試過仍然不能到達滿足約束條件的終結狀態,則該問題無解。

通常回溯法演算法適合用遞迴實現**。當我們到達某乙個節點時,嘗試所有可能的選項並在滿足條件的前提下遞迴下乙個節點。

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中任意一格開始,每一步可以在矩陣中向左右上下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如, 在3*4的矩陣中包含一條字串「bfce」的路徑(路徑中的字母用下劃線標出)。但矩陣中不包含字串「abfb」的路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。

bool haspath

(char

* matrix,

int rows,

int cols,

char

* str)

} delete[

] visited;

return false;

} bool haspathcore

(const

char

* matrix,

int rows,

int cols,

int row,

int col,

const

char

* str,

int& pathlength,bool* visited)

}return haspath;

}

**

功能測試(多行多列矩陣中存在或不存在路徑)

邊界值測試(矩陣只有一行或一列;矩陣和路徑中的所有字母都是相同的)

特殊輸入測試(輸入nullptr指標)

回溯 皇后 演算法筆記 演算法筆記 回溯法

1 0 1揹包問題 思路 構造乙個二叉樹,每個商品都有兩種狀態,要或者不要。如果要就在這個節點的左枝掛子節點,如果不要就在右節點掛子節點。如果全部商品都分配完狀態之後就回溯,回溯到乙個還有其他選擇的節點,接著往這個選擇發展節點,然後再回溯,然後再往下。直到無路可走,就結束了。假如限制重量是10,總共...

回溯法,回溯法解裝載問題

利用回溯法解問題時一般按以下三步驟 1 定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度優先策略搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋 二 回溯法應用 裝載問題 一批貨櫃共n個要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi且w1 w2 wn c1 c2 試確定乙個...

演算法筆記之回溯法(2)

假設地圖共有7個區域,分別是a b c d e f g,對上面順序進行編號,每個區域用乙個結點表示,相鄰的區域有連線,那麼地圖就轉化成乙個無向連線圖。定義問題的解空間。圖的m著色問題解空間形式為n元組,每個分量取值為1,2,3,m,即問題的解是乙個n元向量。由此可得,問題的解空間為,其中顯約束為xi...