剑指offer(C++)-JZ12:矩阵中的路径(算法-回溯)

简介: 剑指offer(C++)-JZ12:矩阵中的路径(算法-回溯)

题目描述:

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

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

示例:

输入:

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"


返回值:

true

解题思路:

本题是回溯法的经典题目,也常用于解决迷宫问题。思路如下:


  1. 用flag记录当前点是否走过,结合矩阵数据和字符数据,运用dfs(深度优先遍历)进行路径探索。
  2. dfs中,若当前点出现下标越界、字符不匹配和已经走过的情况,则终止当前路;若字符匹配上了,则认为当前点满足要求,先暂时将flag设为true,并以该点为中心,继续向上下左右四个方向探索新的点位;若四个方向有路可走,则依次递进,直到有一条路径和字符串完全对应;若四个方向均无路,则回退一步,并将当前点的flag设为false。

总的来说,题目运用了回溯、深度优先遍历和递归的思想。

测试代码:

class Solution {
public:
    // 深度优先遍历
    bool dfs(vector<vector<char>>& matrix, int m, int n, int i, int j, string word, int k, vector<vector<bool>>& flag){
        // 下标越界、字符不匹配、已经遍历过,则false
        if(i < 0 || i >= m || j < 0 || j >= n || matrix[i][j] != word[k] || flag[i][j])
            return false;
        // 刷新标识符
        flag[i][j]= true;
        // 字符串全部集齐,则true
        if(k == int(word.size() - 1))
            return true;
        // 上下左右四方向搜索,若有路通,则true    
        if(dfs(matrix, m, n, i - 1, j, word, k + 1, flag)
           || dfs(matrix, m, n, i + 1, j, word, k + 1, flag)
           || dfs(matrix, m, n, i, j - 1, word, k + 1, flag)
           || dfs(matrix, m, n, i, j +1 , word, k + 1, flag))
           return true;
        // 该点位无有效路径,倒退一步,此点未使用,所以重置flag
        flag[i][j] = false;
        return false;
    }
    // 是否有目标路径
    bool hasPath(vector<vector<char> >& matrix, string word) {
        // 空数据判断
        int m = int(matrix.size());
        int n = int(matrix[0].size());
        if(m == 0 || n == 0)
            return false;
        // flag二维容器存放标识符,判断当前点是否走过
        vector<vector<bool>> flag(m,vector<bool>(n, false));
        // 遍历
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(dfs(matrix, m, n, i, j, word, 0, flag))
                    return true;
            }
        }
        return false;
    }
};


相关文章
|
1月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
2月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
194 3
|
2月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
196 2
|
2月前
|
机器学习/深度学习 传感器 算法
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
200 8
|
2月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
108 2
|
2月前
|
存储 算法 数据可视化
基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真
本程序基于禁忌搜索算法解决旅行商问题(TSP),旨在寻找访问多个城市的最短路径。使用 MATLAB 2022A 编写,包含城市坐标生成、路径优化及结果可视化功能。通过禁忌列表、禁忌长度与藐视准则等机制,提升搜索效率与解的质量,适用于物流配送、路径规划等场景。
|
2月前
|
机器学习/深度学习 负载均衡 算法
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
【卡车和无人机协同配送路径优化】遗传算法求解利用一辆卡车和两架无人机配合,将小包裹递送给随机分布的客户,以使所有站点都由卡车或无人机递送一次后返回起始位置(中转站)研究(Matlab代码实现)
239 7
|
2月前
|
机器学习/深度学习 传感器 算法
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
基于matlab瞬态三角哈里斯鹰算法TTHHO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)(Matlab代码实现)
123 1
|
2月前
|
算法 数据可视化 异构计算
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
235 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
【配送路径规划】基于螳螂虾算法MShOA求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)研究(Matlab代码实现)
132 0
下一篇
oss云网关配置