回溯法 矩陣中的路徑

2022-09-16 03:03:13 字數 1626 閱讀 6992

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

這是乙個可以用回溯法解決的經典題。首先,在矩陣中任選乙個格仔作為路徑的起點。假設矩陣中某個格仔的字元為ch,並且這個格仔將對應於路徑上的第i個字元。如果路徑上的第i個字元不是ch,那麼這個格仔不可能處在路徑上的第i個位置。如果路徑上的第i個字元正好是ch,那麼到相鄰的格仔尋找路徑上得到第i+1個字元。除矩陣邊界上的格仔之外,其他格仔都有4個相鄰的格仔。重複這個過程,直到路徑上的所有字元都在矩陣中找到相應的位置。

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

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

下面的**實現了這個回溯演算法:

bool haspath(char* matrix, int rows, int cols, char*str)

bool* visited = new

bool[rows*cols];//

定義乙個布林矩陣

memset(visited, 0, rows* cols);//

把陣列中的所有值都賦為0

int pathlength = 0;//

指示目標字串的下標

for (int row = 0; row < rows; row++)//

行 }

}delete

visited;

return

false;}

bool haspathcore(const

char* matrix, int rows, int cols, int row, int col, const

char* str, int& pathlength, bool*visited)

bool haspath = false

;

//遞迴的時候如果匹配就進入,不匹配直接return

if (row >= 0 && row < rows&&col >= 0 && col < cols&&matrix[row*cols + col] == str[pathlength] && !visited[row*cols +col])

}return

haspath;

}

當矩陣中座標為(row,col)的格仔和路徑字串中下標為pathlength的字串一樣時,從四個相鄰的格仔(row,col-1)、(row,col+1)、(row+1,col)、(row-1,col)

中去定位路徑字串中下標為pathlength+1的字串。

如果4個相鄰的格仔都沒有匹配字串中下標為pathlength+1的字元,則表明當前路徑字串中下標為pathlength的字元在矩陣中的定位不確定,我們需要回到前乙個字元(pathlength-1),然後重新定位。

一直重複這個過程,直到路徑字串上的所有字元都在矩陣中找到合適的位置(此時str[pathlength]==『\0』)

回溯法 矩陣中的路徑

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

回溯法 23 矩陣中的路徑

演算法思想 嘗試迷宮的每個位置作為起點,進行深度優先搜尋,給每次搜尋計數為u,如果matrix x y str u 則u 1,匹配失敗returnfalse,如果u str。size 1表示匹配完成,return true。如果所有位置都嘗試未成功,則return false。class solut...

回溯法 矩陣中的路徑問題(java)

package cn.csu.offers 矩陣中的路徑 author tiekai ba 2017年6月3日 public class offer 66 boolean visit new boolean rows cols 標記訪問過的矩陣座標位置,初始化為false for int i 0 i...