4 * 3的矩陣如下:
a s a
b f d
c c e
e s e
思路:這是典型的回溯問題(還是從最底層(最簡)的遞迴入手)。
先在4 * 3矩陣中找到與字串首字元相同的矩陣元素ch(找不到就返回false),找到ch後就會觸發4個新的子遞迴,依次遍歷ch上、下、左、右的字元。如果ch上、下、左、右的字元有和字串下乙個字元相同的,那麼就把那個字元當做下一次遍歷的起點,然後繼續觸發新的4個子遞迴;如果ch上、下、左、右的字元都和字串下乙個字元不同,那麼就要退回到上乙個字元繼續完成上乙個字元剩下的遞迴。為了防止路徑重複,需要額外定義乙個布林型陣列記錄遍歷的情況。最後用「或」運算即可得到最終的結果。
每個子遞迴中需要完成的任務:
1.遞迴的第乙個結束條件:字串遇到』\0』,返回true,直接(提前)結束當前子遞迴,回到上一層子遞迴;
2.把每個子遞迴的返回結果haspath初始化為false;
3.如果當前格仔沒有越界(cur_x >= 0 && cur_x < rows&&cur_y >= 0 && cur_y < cols
),也沒有被重複使用過(!visited[cur_x*cols + cur_y]
),且當前格仔的元素和字串中的對應位置(str[pathlength]
)的字元相同。那麼執行下列語句:
3.1
pathlength++
;visited[cur_x*cols + cur_y]
=true
;//表示當前格仔已經被使用過了
然後,進入4個新的格仔,觸發4個新的子遞迴(即從當前格仔為起點,進入當前格仔上、下、左、右4個格仔);
3.2.繼續執行以下語句:
if
(haspath ==
false
)//表示當前格仔觸發的4個子遞迴結果均為false
4.返回結果haspath,結束當前格仔的子遞迴,回到上一層子遞迴。
#include
using
namespace std;
class
solution}}
delete
visited;
return
false;}
private
:bool
haspathcore
(char
*matrix,
int rows,
int cols,
int cur_x,
int cur_y,
char
*str,
int&pathlength,
bool
*visited)
}return haspath;}}
;int
main()
;//char*s = "bcced";
char
*s =
"abcb"
; cout<
haspath
(matrix,3,
4, s)
<
system
("pause");
return0;
}
2020.07.23我覺得劍指offer的**不夠簡潔,自己又重新寫了一遍:
class
solution
return
false;}
bool
dfs(vector
char
>>
& board, string&word, vector
bool
>>
& visited,
int cur_x,
int cur_y,
int count)
return
false;}
};
回溯法 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3 4的矩陣中包含一條字串 bfce 的路徑 路徑中的字母用加粗標出 a ...
LeetCode 回溯 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3 4的矩陣中包含一條字串 bfce 的路徑 路徑中的字母用加粗標出 a ...
回溯法 矩陣中的路徑
題目 請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左 右 上 下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。這是乙個可以用回溯法解決的經典題。首先,在矩陣中任選乙個格仔作為路徑的起點。假設矩...