zoukankan      html  css  js  c++  java
  • 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述

    /*
        请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
        路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
        如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。
    
    举个栗子:
        例如在下面的3*4的矩阵中包含一条字符串”bcced”的路径。
      但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二格子之后,路径不能再次进入这个格子。 a b c e s f c s a d e e
    */

    2. 代码

    思路,回溯法DFS

    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;
        }
    }
  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11519964.html
Copyright © 2011-2022 走看看