191127題(矩陣中的路徑(回溯))

2021-09-29 18:53:10 字數 2121 閱讀 2990

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 ...

回溯法 矩陣中的路徑

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