JZ12 矩阵中的路径

矩阵中的路径_牛客题霸_牛客网

描述

请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如

abcesfcsadee⎣⎡​asa​bfd​cce​ese​⎦⎤​ 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

数据范围:0≤n,m≤20 0≤n,m≤20 ,1≤len≤25 1≤len≤25

示例1

输入:\[a,b,c,e,s,f,c,s,a,d,e,e],"abcced"

返回值:true

回溯:

用回溯解决的问题的所有选项可以形象地用树结构表示,在某一步可能有n个可能的选项,那么该步骤可以看成是树状结构中的一个节点,每一个选项看成树中节点连接线,经过这些连接线到达该节点的n个子节点,树的叶子节点对应着终结状态。

如果树的叶子节点不满足约束条件,那么只好回溯到它的上一个节点再尝试其他选项,如果上一个节点的所有可能的选项都试过了,并且不能满足约束条件的终结状态,再回溯到上一个节点。如果所有节点的所有选项都已经尝试过仍然不能满足约束条件的终结状态,则该问题无解。 剑指Offer --p88

cpp 复制代码
#include <algorithm>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix char字符型vector<vector<>> 
     * @param word string字符串 
     * @return bool布尔型
     */
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // write code here
        int rows = matrix.size();
        int cols = matrix[0].size();
        vector<vector<bool>> visited(rows, vector<bool>(cols, false));

        int word_pos = 0;
        for(int row = 0; row < rows; ++row){
            for(int col = 0; col<cols; ++col){
                if(hasPathCore(matrix, row,col, visited, word,word_pos)){
                    return true;
                }
            }
        
        }
        return false;
    }
    
    bool hasPathCore(vector<vector<char>> &matrix, int row, int col, vector<vector<bool>>& visited,string &word, int word_pos){
        if(word.c_str()[word_pos] == '\0') return true;
        
        if(row < 0 || row >= matrix.size() || col < 0 ||
         col >= matrix[0].size()
          || matrix[row][col] != word[word_pos]
          || visited[row][col]) return false;

        visited[row][col] = true; //
        bool hasPath = hasPathCore(matrix, row+1, col,visited, word, word_pos+1)||
                       hasPathCore(matrix, row-1, col,visited, word, word_pos+1)||
                       hasPathCore(matrix, row, col+1,visited, word, word_pos+1)||
                       hasPathCore(matrix, row, col-1,visited, word, word_pos+1);
        visited[row][col] = false;//递归完四个方向后回到原来的状态继续进行决策
        return hasPath;
    }
    
};
相关推荐
无限码力1 分钟前
华为非AI方向笔试真题【工厂落点最小加权路程】
算法·华为·华为非ai方向笔试真题·华为笔试真题·华为最新笔试真题·华为笔试题库
FFZero11 分钟前
[mpv架构] (4) demux 线程到底在“预读“什么?
c++·架构·音视频·多媒体
residual_fan7 分钟前
数据缺失填补算法之CUR-Estimator
算法·数据挖掘·数据分析
西西弗Sisyphus9 分钟前
C++ 实现 替代 OpenCV resize INTER_LINEAR 的一种方式
c++·opencv
wabs66613 分钟前
关于二叉树【力扣107.二叉树的层序遍历II的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
galaxy_strive28 分钟前
Qt C++插件化编写项目(1)
开发语言·c++·qt
见叶之秋39 分钟前
【C++】C++ 核心进阶(一):泛型编程基石 —— 模板初阶与 STL 体系开篇
开发语言·c++
一切皆是因缘际会1 小时前
资源的适配
大数据·人工智能·算法
鲸能云1 小时前
【智慧能源】源储调售一体化架构与 EMS 滚动调度算法实践 —— 工商业光储收益提升 22% 的技术拆解
算法·架构·能源
一木 之林1 小时前
四、STL 容器与数据结构(进阶)(二)
数据结构·c++·哈希算法