• JZ12 矩阵中的路径


    剑指Offer编程链接:JZ12

    题目描述:
    在这里插入图片描述
    思路:递归+回溯的方法,总结一下什么情况需要使用递归:

    递归在解决问题时,通常涉及以下情况:

    1. 问题可被分解为较小的相似子问题。
    2. 子问题与原问题具有相同的结构,只是规模更小。
    3. 每个子问题的解可以通过递归调用来获得。
    4. 存在基本情况,当问题足够小时可以直接求解。

    递归适用于许多问题,如数学运算(如阶乘、斐波那契数列)、树结构遍历、图算法、字符串处理等。然而,使用递归时要注意合适的终止条件和避免出现无限递归。

    具体做法:
    step 1:优先处理矩阵为空的特殊情况。
    step 2:设置flag数组记录某一次路径中矩阵中的位置是否被经过,因此一条路径不能回头。
    step 3:遍历矩阵,对每个位置进行递归。
    step 4:递归查找的时候,到了矩阵的边界或者是下一个字符与这个位置的字符不匹配,或者节点已经访问过了,或者字符串匹配完成都结束递归。
    step 5:访问节点,修改flag数组,向其他四个方向延伸,回溯的时候修改flag数组。

    代码:

    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param matrix char字符型二维数组 
         * @param word string字符串 
         * @return bool布尔型
         */
        //i代表数组行,j代表列,matrix代表矩阵,n*m 矩阵,word代表要匹配的字符串,k代表当前第几个字符
        private boolean dfs(char[][] matrix,int n,int m,int i,int j,String word,int k,boolean[][] flag){
            //下标越界、字符不匹配、已经遍历过不能重复
            if(i<0||i>=n||j<0||j>=m||(matrix[i][j]!=word.charAt(k))||(flag[i][j]==true)){
                return false;
            }
            if(k==word.length()-1){
                return true;
            }
            flag[i][j] = true;
            //该结点四个方向
            if(dfs(matrix,n,m,i-1,j,word,k+1,flag)||dfs(matrix,n,m,i+1,j,word,k+1,flag)||dfs(matrix,n,m,i,j-1,word,k+1,flag)||dfs(matrix,n,m,i,j+1,word,k+1,flag)){
                return true;
            }
            //此格未被占用
            flag[i][j] = false;
            return false;
        }
        public boolean hasPath (char[][] matrix, String word) {
            // write code here
            if(matrix.length == 0){
                return false;
            }
            int n = matrix.length;
            int m = matrix[0].length;
            boolean[][] flag = new boolean[n][m];
            for(int i = 0;i<n;i++){
                for(int j = 0;j<m;j++){
                    if(dfs(matrix,n,m,i,j,word,0,flag)){
                        return true;
                    }
                }
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    CY3.5/CY5/CY5.5/CY7/CY7.5荧光标记壳多糖/壳质/角素Chitin
    51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储&秒表
    【大话Presto 】- 核心概念
    C++_默认值拷贝构造函数_构造函数顺序
    Redis 的6种回收策略(淘汰策略)详解
    零基础入门学习Python第二阶04SQL详解03
    想开发DAYU200,我教你
    CSS 基础知识-01
    WOL唤醒配置(以太网、PHY、MAC)
    ArcGIS:如何制作数据统计图?
  • 原文地址:https://blog.csdn.net/qq_45257495/article/details/132588746