題目:請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。
這是乙個可以用回溯法解決的經典題。首先,在矩陣中任選乙個格仔作為路徑的起點。假設矩陣中某個格仔的字元為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...