請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。 例如
矩陣中包含一條字串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字串的第乙個字元b佔據了矩陣中的第一行第二個格仔之後,路徑不能再次進入該格仔。
思路:首先看到這個題目,思路很明確,使用dfs遞迴的回溯剪枝思想,即新增一些判斷條件使得程式不再遞迴下去。首先對於matrix中的每乙個都可能是起點,需要遍歷。由題可知,只要找到一條路徑,即可返回true;
對於從每乙個點開始的子路徑,因為使用遞迴,我們只需知道在這一步該怎麼做即可,不用管之後該怎麼做。同時找到乙個遞迴的出口即可。
0.根據給定陣列,初始化乙個標誌位陣列,初始化為false,表示未走過,true表示已經走過,不能走第二次
1.根據行數和列數,遍歷陣列,先找到乙個與str字串的第乙個元素相匹配的矩陣元素,進入judge
2.根據i和j先確定一維陣列的位置,因為給定的matrix是乙個一維陣列
3.確定遞迴終止條件:越界,當前找到的矩陣值不等於陣列對應位置的值,已經走過的,這三類情況,都直接false,說明這條路不通
4.若k,就是待判定的字串str的索引已經判斷到了最後一位,此時說明是匹配成功的
5.下面就是本題的精髓,遞迴不斷地尋找周圍四個格仔是否符合條件,只要有乙個格仔符合條件,就繼續再找這個符合條件的格仔的四周是否存在符合條件的格仔,直到k到達末尾或者不滿足遞迴條件就停止。
6.走到這一步,說明本次是不成功的,我們要還原一下標誌位陣列index處的標誌位,進入下一輪的判斷。
python 實現:
# -*- coding:utf-8 -*-
class solution:
def haspath(self, matrix, rows, cols, path):
# write code here
if not matrix or not path:
return false
index_arr = [i for i in range(len(matrix)) if matrix[i]==path[0]]
for i in index_arr:
if self.findpath(matrix,rows,cols,path,i,):
return true
return false
def findpath(self, matrix, rows, cols, path, index, visited):
if index in visited:
return false
if index < 0 or index >= len(matrix):
return false
if not path:
return false
if matrix[index] != path[0]:
return false
# 如果前面的情況都不存在,當前元素與path中第乙個元素相等,此時
# 如果path的長度等於1
if len(path) == 1:
return true
# 第乙個元素下標0只能向右向下
if index == 0:
return self.findpath(matrix,rows,cols,path[1:],index+1,visited) or self.findpath(matrix, rows, cols,path[1:],index+cols,visited)
# 最後乙個元素
if index == len(matrix) - 1:
return self.findpath(matrix, rows, cols, path[1:], index - 1, visited) or self.findpath(matrix, rows, cols,path[1:],index-cols,visited)
# 元素在第一列
if index % cols == 0:
return self.findpath(matrix, rows, cols, path[1:], index + 1, visited) or self.findpath(matrix, rows, cols,path[1:],index-cols,visited) or self.findpath(matrix, rows, cols, path[1:], index + cols, visited)
# 元素在最後一列
if (index + 1) % cols == 0:
return self.findpath(matrix, rows, cols, path[1:], index - 1, visited) or self.findpath(matrix, rows, cols, path[1:], index - cols, visited) or self.findpath(matrix, rows, cols, path[1:], index + cols, visited)
else:
return self.findpath(matrix, rows, cols, path[1:], index + 1, visited) or self.findpath(matrix, rows, cols,path[1:], index - 1, visited) or self.findpath(matrix, rows, cols, path[1:], index - cols, visited) or self.findpath(matrix, rows, cols, path[1:],index + cols, visited)
回溯法是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
回溯法可以理解為通過選擇不同的岔路口尋找目的地,乙個岔路口乙個岔路口的去嘗試找到目的地。如果走錯了路,繼續返回來找到岔路口的另一條路,直到找到目的地。
回溯法與遞迴:
回溯法是一種思想,遞迴是一種形式
劍指Offer 六十五 矩陣中的路徑
解法1 首先,遍歷這個矩陣,我們很容易就能找到與字串matrix中第乙個字元相同的矩陣元素p 0 然後遍歷p 0 的上下左右四個字元,如果有和字串matrix中下乙個字元相同的,就把那個字元當作下乙個字元 下一次遍歷的起點 如果沒有,就需要回退到上乙個字元,然後重新遍歷。為了避免路徑重疊,需要乙個輔...
劍指Offer六十五 矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 矩陣中包含一條字串 bcced 的路徑,但是矩陣中不包含 abcb...
矩陣中的路徑
請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意乙個格仔開始,每一步可以在矩陣中向左,向右,向上,向下移動乙個格仔。如果一條路徑經過了矩陣中的某乙個格仔,則該路徑不能再進入該格仔。例如 3 4 矩陣 a b c e s f c s a d e e 中包...