1. 程式人生 > 其它 >dsf對矩陣進行搜尋

dsf對矩陣進行搜尋

public static boolean dfs(char[][] board, char[] word, int i, int j, int k) {
            
            //遞迴出口1
            if(i<0||j<0||i>=board.length||j>=board[0].length||board[i][j]!=word[k]) {
                return false;
            }//經過這裡的判斷後,board[i][j]==word[k]
            //遞迴出口2,注意這裡的順序不能交換
if(k==word.length-1) { return true; } //將 board[i][j] 修改為 空字元 '' board[i][j]='\0'; //順序:上,下,左,右找k+1 boolean res=dfs(board, word, i-1, j, k+1)||dfs(board, word, i-1, j, k+1)|| dfs(board, word, i, j
-1, k+1)||dfs(board, word, i, j+1, k+1); // 還原當前矩陣元素: 將 board[i][j] 元素還原至初始值,即 word[k] 。當程式執行到這一步就說明board[i][j]==word[k] //但是不能再搜尋下去了,不滿足條件,恢復資料,相當於在回溯。 board[i][j]=word[k]; return res; } public static boolean exist(char[][] board, String word) {
//i=0,j=0開始搜尋 char[] wordc=word.toCharArray(); for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { if(dfs(board, wordc, i, j, 0)) { return true; } } } return false; }

題目描述:

給定一個m x n 二維字元網格board 和一個字串單詞word 。如果word 存在於網格中,返回 true ;否則,返回 false 。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母不允許被重複使用。

思路:

深度優先搜尋: 可以理解為暴力法遍歷矩陣中所有字串可能性。DFS 通過遞迴,先朝一個方向搜到底,
    再回溯至上個節點,沿另一個方向搜尋,以此類推。
剪枝: 在搜尋中,遇到 這條路不可能和目標字串匹配成功 的情況
  (例如:此矩陣元素和目標字元不同、此元素已被訪問),則應立即返回,稱之為 可行性剪枝 。
遞迴引數: 當前元素在矩陣 board 中的行列索引 i 和 j ,當前目標字元在 word 中的索引 k 。
終止條件:
返回 falsefalse : (1) 行或列索引越界 或 (2) 當前矩陣元素與目標字元不同 或 (3) 當前矩陣元素已訪問過 ( (3) 可合併至 (2) ) 。
返回 truetrue : k = len(word) - 1 ,即字串 word 已全部匹配。
遞推工作:
  標記當前矩陣元素: 將 board[i][j] 修改為 空字元 '' ,代表此元素已訪問過,防止之後搜尋時重複訪問。
  搜尋下一單元格: 朝當前元素的 上、下、左、右 四個方向開啟下層遞迴,使用 或 連線 (代表只需找到一條可行路徑就直接返回,
  不再做後續 DFS ),並記錄結果至 res 。
   還原當前矩陣元素: 將 board[i][j] 元素還原至初始值,即 word[k] 。
返回值:
返回布林量 res ,代表是否搜尋到目標字串。