• acwing 23. 矩阵中的路径


    习题地址 https://www.acwing.com/problem/content/description/21/

    题目描述
    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

    路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

    如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

    注意:

    输入的路径不为空;
    所有出现的字符均为大写英文字母;
    样例

    样例

    matrix=
    [
      ["A","B","C","E"],
      ["S","F","C","S"],
      ["A","D","E","E"]
    ]
    
    str="BCCE" , return "true" 
    
    str="ASAE" , return "false"

    算法1
    按照Y老师视频的说就是 典型的暴搜例子
    我们按照搜索的模板来定义

    1 寻找起始点 (第一个符合条件的字母) ,添加一个同样大小的多维数组 维护该点是否访问过
    2 深度搜索(四个方向扩展)
    3 设置正确的退出点 不符合条件 坐标越界 字符串长度越界等
    4 继续下一轮搜索 记得将访问数组中对应的点恢复原样

    class Solution {
    public:
    
    bool dfs(vector<vector<char>>& matrix, string str,int idx, vector<vector<char>>& vis, int x, int y)
    {
        //坐标错误则直接返回
        if (x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size())
            return false;
        //该点字符与字符串不同 直接返回
        if (matrix[x][y] != str[idx])
            return false;
        //该坐标已经访问 直接返回
        if (vis[x ][y] != 0)
            return false;
    
        //该点记录置1
        vis[x][y] = 1;
    
        //检测是否完全符合str字符串
        if (idx == str.length() - 1)
            return true;
    
        //四个方向的遍历 任意一个符合条件则返回成功
        if ( dfs(matrix, str, idx + 1, vis, x + 1, y))
            return true;
    
        if (  dfs(matrix, str, idx + 1, vis, x - 1, y))
            return true;
    
        if (  dfs(matrix, str, idx + 1, vis, x, y + 1))
            return true;
    
        if (dfs(matrix, str, idx + 1, vis, x, y - 1))
            return true;
    
        //函数退出的时候记得回复访问数据
        vis[x][y] = 0;
    
        return false;
    }
    
    
    
    bool hasPath(vector<vector<char>>& matrix, string str) {
        vector<vector<char>> vis = matrix;
        for (int i = 0; i < vis.size(); i++) {
            for (int j = 0; j < vis[0].size(); j++) {
                vis[i][j] = 0;
            }
        }
    
        for(int i = 0; i < matrix.size(); i++) {
            for (int j = 0; j < matrix[0].size(); j++) {
                if (matrix[i][j] == str[0]) {
                    if (true == dfs(matrix,str,0, vis,i,j))
                    {
                        return true;
                    }
                }
            }
        }
    
    
        return false;
    }
    };
    
    作者:defddr
    链接:https://www.acwing.com/solution/acwing/content/3179/
    来源:AcWing
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    应用程序与数据库结合使用的三种方式
    mysql内置功能—存储过程
    mysql内置功能—事务
    mysql内置功能—触发器
    mysql内置功能—视图
    pymysql模块
    SQL逻辑查询语句执行顺序
    多表查询
    单表查询
    数据的增删改查
  • 原文地址:https://www.cnblogs.com/itdef/p/11262608.html
Copyright © 2020-2023  润新知