面試題六 矩陣中的路徑詳解

2021-10-05 02:52:47 字數 1700 閱讀 1844

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格仔。例如,在下面的3乘4的矩陣中包含了一條字串「bfce」的路徑(路徑中的字母用粗體標出)。但矩陣中不包含字串「abfb」的路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入這個格仔。

abt g

cfcs

j deh

第一反應是遞迴,和乙個標記路徑的陣列,其它的貌似也沒什麼了,直接上**。

int dr[4]

=;int dc[4]

=;//方向向量

int road[m]

[n];

//m為二維矩陣的高,n為二維矩陣的寬,double_string[m][n]為原二維矩陣

int i,j;

for(i=

0;i)for

(j=0

;j) road[i]

[j]=0;

//將路徑陣列初始標記為未走過,走過後,賦值為1

bool

get_string

(int depth,

int aidstring_length,

char

*aidstring,

int x,

int y)

for(i=

0;i<

4;i++)}

}}

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

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

由於路徑不能重複進入矩陣的格仔,所以還需要定義和字元矩陣大小一樣的布林值矩陣,用來標識路徑是否已經進入了每個格仔。下面的**實現了這個回溯演算法:

bool

haspath

(char

* matrix,

int rows,

int cols,

char

* str)}}

delete

visited;

return

false;}

bool

haspathcore

(const

char

* matrix,

int rows,

int cols,

int row,

int col,

const

char

* str,

int& pathlength,

bool

* visited)

}return haspath;

}

面試題 矩陣中的路徑

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

面試題12 矩陣中的路徑

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

面試題12 矩陣中的路徑

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