劍指offer:矩陣中的路徑(遞歸回溯法DFS相似迷宮)

1. 題目描述

/*
    請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串全部字符的路徑。
    路徑能夠從矩陣中的任意一個格子開始,每一步能夠在矩陣中向左,向右,向上,向下移動一個格子。
    若是一條路徑通過了矩陣中的某一個格子,則該路徑不能再進入該格子。

舉個栗子:
    例如在下面的3*4的矩陣中包含一條字符串」bcced」的路徑。
  但矩陣中不包含字符串「abcb」的路徑,由於字符串的第一個字符b佔據了矩陣中的第一行第二格子以後,路徑不能再次進入這個格子。 a b c e s f c s a d e e
*/

 

2. 代碼

思路,回溯法DFSjava

import java.util.*;
public class Solution {
    public static char[] matrix;
    public static int rows;
    public static int cols;
    public static char[] str;
    public static boolean[]flag;//標誌是否已經進入過
    public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
        //標誌位,初始化爲false
        this.matrix = matrix;
        this.rows = rows;
        this.cols = cols;
        this.str = str;
        flag = new boolean[matrix.length];
        for(int i=0; i<rows; i++){
            for(int j=0; j<cols; j++){
                 //循環遍歷二維數組,找到起點等於str第一個元素的值,再遞歸判斷四周是否有符合條件的----回溯法
                 if(dfs(i,j,0)){
                     return true;
                 }
            }
        }
        return false;
    }
     
    //dfs(索引行座標i,索引縱座標j,待判斷的字符串的索引k)
    private boolean dfs(int i,int j,int k){
        //先根據i和j計算匹配的第一個元素轉爲一維數組的位置
        int index = i*cols+j;
        //遞歸終止條件
        if(i<0 || i>=rows || j<0 || j>=cols || flag[index] || matrix[index] != str[k]){
             return false;
        }
        //若k已經到達str末尾了,說明以前的都已經匹配成功了,直接返回true便可
        if(k == str.length-1){
             return true;
        }
        //要走的第一個位置置爲true,表示已經走過了
        flag[index] = true;
         
        //回溯,遞歸尋找,每次找到了就給k加一,找不到,還原
        if(dfs(i-1,j,k+1)||dfs(i+1,j,k+1)||dfs(i,j-1,k+1)||dfs(i,j+1,k+1)){
            return true;
        }
        //走到這,說明這一條路不通,還原,再試其餘的路徑
        flag[index] = false;
        return false;
    }
}
相關文章
相關標籤/搜索