演算法和資料操作 回溯法

2022-07-06 01:03:12 字數 2670 閱讀 9132

從解決問題的每一步的所有可能選項裡系統的選擇出乙個可行解決方案。回溯法非常適合有多個步驟組成的問題,每個步驟有多個選項,當我們在某一部選擇了其中的額乙個選項,就進入下一步,然後又面臨新的選項。重複選擇到達最終狀態

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

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

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

面試題12.矩陣中的路徑

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串給所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左右上下移動一格。如果一條路徑經過了矩陣的某乙個,那麼該路徑不能再次進入格仔。

思路:任選乙個格仔作為路徑的起點。假設矩陣中某乙個字元是ch,作為第i個字元。如果路徑上的第i個字元不是ch,那麼這個格仔不可能處在路徑上的第i個位置。入股哦路徑上的第i個字元正好是ch,那麼到相鄰格仔尋找路徑上的第i+1個字元。除矩陣邊界上的格仔之外,其他格仔都有4個相鄰的格仔。重複過程直到所有字元都在矩陣中找到相應的位置

由於回溯法的特殊性質,路徑可以被看作乙個棧。在前n個字元位置確定後,與第n個字元對應的格仔的周圍都沒有找到第n+1個字元,這時候只好在路徑上回到第n-1個字元,重新定位第n個字元。

由於路徑上的格仔不能重複進入,所以還需要定義乙個和字元矩陣大小一樣的布林型矩陣用來標識路徑是否已經進入了每個格仔。

public

class

pathmatrix

//標記函式,初始化為false

boolean visited = new

boolean[rows][columns];

for(int i=0;i)

}//路徑長度

int pathlength=0;

//for(int i=0;i)}}

return

false

; }

public

static boolean haspathcore(char matrix,int rows,int columns,int row,int column,string str,int pathlength,boolean visited,int

totallength)

boolean haspath=false

;

if(row>=0&&row=0&&columnvisited[row][column])

}return

haspath;

}public

static

void

main(string args),,};

string str="bfce";

int rows=matrix.length;

int columns=matrix[0].length;

int totallength=str.length();

system.out.println(haspath(matrix,rows,columns,str,totallength));}}

理解了上面這題在做下面這題就容易多了

面試題13.機械人的運動範圍

題目:地上有乙個m行n列的耳房各。乙個機械人從座標(0,0)的格仔開始移動,他每次可向上下左右移動一格,但不能進入行座標和列座標的數字之和大於k的格仔。例如當k=18的時候,機械人能進入(35,37),因為3+5+3+7=18,但不能進入方格(35,38),因為3+5+3+8>18

在本地上測試的**

放到leetcode上執行

演算法和資料結構(Python) 回溯法求排列組合

需要找陣列中數字的組合或排列 回溯法res tmp if 1.設定條件 把需要的當前列表加入res return res for 選擇 in 選擇列表 2.做選 3.遞迴調 backtrack 選擇列表,當前列表,res 4.撤銷選 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 inpu...

演算法 回溯法

0.0 回溯法核心 go depth begin from go 0 1.0 八皇后問題 問題描述 將八位皇后放在一張8x8的棋盤上,使得即任意兩個皇后都不在同一條橫線,豎線和斜線上,問一共有多少種擺法?暴力窮舉 step 1 先不考慮對稱性和可行性,一共是c 8 64 c tbinom c 648...

演算法 回溯法

用回溯法解問題時,應明確定義問題的解空間。問題的解空間至少包含問題的乙個 最優 解。例如對於有n種可選擇物品的0 1揹包問題,其解空間由長度為n的0 1向量組成。該解空間包含對變數的所有可能的0 1賦值。例如n 3時,其解空間是 定義了問題的解空間後,還應該將解空間很好地組織起來,使得能用回溯法方便...