剑指offer(65)矩阵中的路径
題目描述
請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如 a b c e s f c s a d e e 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字符串的第一個字符b占據了矩陣中的第一行第二個格子之后,路徑不能再次進入該格子。
題目分析
分析題意,我們可以知道這道題用回溯法解決最好,因為我們需要一個一個字母的匹配,當發現不行時,就要回溯上個步驟,選擇另一步。
?回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇并不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。
回溯法的基本思想:
?在包含問題的所有解的解空間樹中,按照深度優先搜索的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜索算法)。
?????? 若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜索遍才結束。
?????? 而若使用回溯法求任一個解時,只要搜索到問題的一個解就可以結束。
字典樹也有點和回溯法的解空間樹類似。
代碼
function hasPath(matrix, rows, cols, path) {const pathLength = 0;const visited = new Array(rows * cols);for (let row = 0; row < rows; row++) {for (let col = 0; col < cols; col++) {// 遍歷,遍歷的點為起點。if (hasPathCore(matrix, rows, cols, row, col, path, pathLength, visited)) {return true;}}}return false; } function hasPathCore(matrix, rows, cols, row, col, path, pathLength, visited) {let hasPath = false;if (pathLength === path.length) return true;if (row >= 0 &&row < rows &&col >= 0 &&col < cols &&matrix[row * cols + col] === path[pathLength] &&!visited[row * cols + col]) {++pathLength;visited[row * cols + col] = true;// 因為||為短路運算符,只要第一個滿足就會返回,而不會去計算后面的,所以有些路徑可以不用去走。hasPath =hasPathCore(matrix, rows, cols, row - 1, col, path, pathLength, visited) ||hasPathCore(matrix, rows, cols, row, col - 1, path, pathLength, visited) ||hasPathCore(matrix, rows, cols, row + 1, col, path, pathLength, visited) ||hasPathCore(matrix, rows, cols, row, col + 1, path, pathLength, visited);if (!hasPath) {--pathLength;visited[row * cols + col] = false;}}return hasPath; }?
轉載于:https://www.cnblogs.com/wuguanglin/p/hasPath.html
總結
以上是生活随笔為你收集整理的剑指offer(65)矩阵中的路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET整合Discuz!NT3.
- 下一篇: 好视通-视频会议存在弱口令&任意