首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在递归中查找矩阵中的路径

是一个经典的算法问题,通常用于在给定的矩阵中查找是否存在一条路径,该路径经过矩阵中的某些格子,并且路径上的字符按照给定的顺序排列。

算法思路如下:

  1. 首先定义一个与给定矩阵相同大小的布尔类型矩阵,用于标记路径是否已经访问过。
  2. 遍历矩阵中的每一个格子,对于每个格子,都从它的上、下、左、右四个方向开始递归查找路径。
  3. 在递归函数中,首先判断当前格子是否越界或者已经访问过,如果是,则返回false。
  4. 如果当前格子的字符与路径中的字符匹配,则继续递归查找路径。
  5. 在递归函数中,如果路径已经找到,返回true;否则,将当前格子标记为已访问,然后继续在上、下、左、右四个方向上递归查找路径。
  6. 如果四个方向上的递归都没有找到路径,则将当前格子标记为未访问,返回false。

以下是一个完整的示例代码:

代码语言:txt
复制
def exist(matrix, word):
    if not matrix or not matrix[0]:
        return False
    
    rows, cols = len(matrix), len(matrix[0])
    visited = [[False] * cols for _ in range(rows)]
    
    for i in range(rows):
        for j in range(cols):
            if dfs(matrix, word, visited, i, j, 0):
                return True
    
    return False

def dfs(matrix, word, visited, row, col, index):
    if index == len(word):
        return True
    
    if (row < 0 or row >= len(matrix) or col < 0 or col >= len(matrix[0]) or
        visited[row][col] or matrix[row][col] != word[index]):
        return False
    
    visited[row][col] = True
    
    if (dfs(matrix, word, visited, row - 1, col, index + 1) or
        dfs(matrix, word, visited, row + 1, col, index + 1) or
        dfs(matrix, word, visited, row, col - 1, index + 1) or
        dfs(matrix, word, visited, row, col + 1, index + 1)):
        return True
    
    visited[row][col] = False
    
    return False

这个算法的时间复杂度为O(mn3^k),其中m和n分别为矩阵的行数和列数,k为路径的长度。在最坏情况下,需要遍历矩阵中的每个格子,并且每个格子都有三个方向可以选择。

这个算法可以应用于许多场景,例如在游戏中寻找单词、解决迷宫问题等。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的关系型数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。产品介绍链接
  • 腾讯云物联网(IoT):提供全面的物联网解决方案,帮助连接和管理物联网设备。产品介绍链接
  • 腾讯云区块链服务(BCS):提供高性能、可扩展的区块链服务,支持多种区块链框架。产品介绍链接
  • 腾讯云视频处理(VOD):提供视频上传、转码、截图、水印等功能,满足视频处理需求。产品介绍链接
  • 腾讯云音视频通信(TRTC):提供实时音视频通信能力,支持多种场景的音视频通话。产品介绍链接

以上是腾讯云提供的一些相关产品,可以根据具体需求选择适合的产品来支持云计算和相关领域的开发工作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

经典算法题-矩阵查找单词路径

你会得到一个字符串数组,表示一个字符矩阵,你还会得到一个字符串查找,需要在矩阵查找这个单词,单词开始点可能在矩阵任意位置,方向可以是上,下,左,右,或者对角,也可能多次使用矩阵字符,但是你不可以同一行相同单元两次...你需要返回一个整数,表示矩阵中发现路径个数,如果返回路径超过 1,000,000,000,就返回 -1。...查找单词包含 1-50 个字符 Examples 举例 0) {"ABC", "FED", "GHI"} "ABCDEFGHI" Returns: 1 返回 1 There is only one...只有一个路径可以查到 1) {"ABC", "FED", "GAI"} "ABCDEA" Returns: 2 返回 2 Once we get to the 'E', we can choose...这个将超过 1,000,000,000 种路径,返回 -1 6) ????

1.1K10

矩阵路径

题目描述 请设计一个函数,用来判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一个格子开始,每一步可以矩阵向左,向右,向上,向下移动一个格子。...如果一条路径经过了矩阵某一个格子,则该路径不能再进入该格子。...例如 a b c e s f c s a d e e 矩阵包含一条字符串"bcced"路径,但是矩阵不包含"abcb"路径,因为字符串第一个字符b占据了矩阵第一行第二个格子之后,路径不能再次进入该格子...思路 回溯法: 对于此题,我们需要设置一个判断是否走过标志数组,长度和矩阵大小相等 我们对于每个结点都进行一次judge判断,且每次判断失败我们应该使标志位恢复原状即回溯 judge里一些返回false...判断: 如果要判断(i,j)不在矩阵里 如果当前位置字符和字符串对应位置字符不同 如果当前(i,j)位置已经走过了 否则先设置当前位置走过了,然后判断其向上下左右位置走时候有没有满足要求.

1.1K20

寻找矩阵路径

前言 给定一个矩阵和一个字符串,如何从矩阵寻找出这个字符串矩阵路径?本文就跟大家分享下如何使用回溯法来解决这个问题,欢迎各位感兴趣开发者阅读本文。...实现思路 我们先从题目给出条件入手,逐步分析得出思路,矩阵就是一个二维数组,字符串可以切割成一个数组,我们要做就是按顺序取出字符串每个字符,判断其是否矩阵,能否组成一条完整路径出来。...举例分析 现有一个矩阵(如下所示),有一个字符串bfce,我们需要从矩阵找出这个字符串矩阵中所连接起来路径。...2,2 位置元素是e,与目标值匹配,所有字符寻找完毕,该路径存在与矩阵 保存每一步已找到元素矩阵索引 [2,2]位置 [1,2]位置 [1,1]位置 [0,1]位置 最终路径为:[0][1]...实现代码 我们分析出思路后,接下来我们来看下实现代码,代码分为2部分: 主函数,用于参数规则判断、寻找切入点、返回找到路径 寻找路径函数,用于矩阵寻找每一个字符 主函数 主函数接受2个参数:路径矩阵

1.1K40

剑指offer 矩阵路径

题目描述 请设计一个函数,用来判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一个格子开始,每一步可以矩阵向左,向右,向上,向下移动一个格子。...如果一条路径经过了矩阵某一个格子,则之后不能再次进入这个格子。...例如 a b c e s f c s a d e e 这样3 X 4 矩阵包含一条字符串"bcced"路径,但是矩阵不包含"abcb"路径,因为字符串第一个字符b占据了矩阵第一行第二个格子之后...首先,遍历这个矩阵,我们很容易就能找到与字符串str第一个字符相同矩阵元素ch。...为了避免路径重叠,需要一个辅助矩阵来记录路径情况。

41420

矩阵路径

如果 word 存在于网格,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻单元格内字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻单元格。...同一个单元格内字母不允许被重复使用。 例如,在下面的 3×4 矩阵包含单词 "ABCCED"(单词字母已标出) ?...剪枝: 搜索,遇到 这条路不可能和目标字符串匹配成功 情况(例如:此矩阵元素和目标字符不同、此元素已被访问),则应立即返回,称之为 可行性剪枝 ?...DFS 解析: 递归参数: 当前元素矩阵 board 行列索引 i 和 j ,当前目标字符 word 索引 k 。...搜索下一单元格: 朝当前元素 上、下、左、右 四个方向开启下层递归,使用 或 连接 (代表只需找到一条可行路径就直接返回,不再做后续 DFS ),并记录结果至 res 。

30920

矩阵路径

如果 word 存在于网格,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻单元格内字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻单元格。...同一个单元格内字母不允许被重复使用。 例如,在下面的 3×4 矩阵包含单词 "ABCCED"(单词字母已标出)。...大致有如下问题: 1、currValue - 当前已处理获得字符串,调用方法时, 需要新建,如:String newCurrValue = new String(currValue...= board[i][j] 3、是否满足期望条件就看查找下标值已达最大,如: if (currToFind == wordChars.length - 1) { return...、左4个方向递归调用后,回溯,重新将元素标记为false visited[i][j] = false; return findResult; } 这样,题目剑指offer 12.矩阵路径

37710

golang刷leetcode 技巧(45)矩阵路径

请设计一个函数,用来判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一格开始,每一步可以矩阵向左、右、上、下移动一格。...如果一条路径经过了矩阵某一格,那么该路径不能再次进入该格子。例如,在下面的3×4矩阵包含一条字符串“bfce”路径路径字母用加粗标出)。...[["a","b","c","e"], ["s","f","c","s"], ["a","d","e","e"]] 但矩阵不包含字符串“abfb”路径,因为字符串第一个字符b占据了矩阵第一行第二个格子之后...,路径不能再次进入这个格子。...<= 200 1 <= board[i].length <= 200 解题思路 1,深度优先遍历 2,首字母不匹配可以剪枝 3,注意golang slice 数据地址一样,所以,需要clone 路径

14720

矩阵路径

题目描述 判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一个格子开始,每一步可以矩阵向上下左右移动一个格子。...如果一条路径经过了矩阵某一个格子,则该路径不能再进入该格子。 例如下面的矩阵包含了一条 bfce 路径。 ?...解题思路 使用回溯法(backtracking)进行求解,它是一种暴力搜索方法,通过搜索所有可能结果来求解问题。...回溯法一次搜索结束时需要进行回溯(回退),将这一次搜索过程设置状态进行清除,从而开始一次新搜索过程。...例如下图示例,从 f 开始,下一步有 4 种搜索可能,如果先搜索 b,需要将 b 标记为已经使用,防止重复使用。在这一次搜索结束之后,需要将 b 已经使用状态清除,并搜索 c。 ?

32110

剑指offer No.65 矩阵路径

题目描述 请设计一个函数,用来判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一个格子开始,每一步可以矩阵向左,向右,向上,向下移动一个格子。...如果一条路径经过了矩阵某一个格子,则之后不能再次进入这个格子。...例如 a b c e s f c s a d e e 这样3 X 4 矩阵包含一条字符串"bcced"路径,但是矩阵不包含"abcb"路径,因为字符串第一个字符b占据了矩阵第一行第二个格子之后...首先,遍历这个矩阵,我们很容易就能找到与字符串str第一个字符相同矩阵元素ch。...为了避免路径重叠,需要一个辅助矩阵来记录路径情况。

19730

剑指offer第10题:矩阵路径

矩阵路径 剑指Offer 12:矩阵路径【中等题】” ? 题目描述 方法:回溯 根据题目要求,需要我们从一个已知矩阵中找到一个可以挨个形成给定字符串路径。...从题目的解析上,我们可以很自然联想到遍历整个矩阵,只是遍历整个矩阵时,我们还需要保证每一次使用元素不能重复,此时我们可以联想到回溯算法。...首先我们需要建立一个访问矩阵vis,遍历整个矩阵,找到字符串第一个字符,这个位置将会被我们用来作为开始位置。...然后以此处为中心,开始向四周进行扩展遍历,查看扩展路径,能否有一条到达字符串最后字符路径,如果有的话,我们便找到了我们需要这个字符串路径。...我们后续刷题过程,最主要就是抓住两点,一个是回溯条件,还有一个就是结束条件,将这两个条件捋清楚之后,剩下代码实现都是十分简洁

35920

LeetCode-面试题12-矩阵路径

# LeetCode-面试题12-矩阵路径 请设计一个函数,用来判断一个矩阵是否存在一条包含某字符串所有字符路径路径可以从矩阵任意一格开始,每一步可以矩阵向左、右、上、下移动一格。...如果一条路径经过了矩阵某一格,那么该路径不能再次进入该格子。例如,在下面的3×4矩阵包含一条字符串“bfce”路径路径字母用加粗标出)。...[["a","b","c","e"], ["s","f","c","s"], ["a","d","e","e"]] 但矩阵不包含字符串“abfb”路径,因为字符串第一个字符b占据了矩阵第一行第二个格子之后...矩阵中选择任意一个格子作为路径七点,假设矩阵某个格子字符为ch,并且这个格子将对应于路径第i个字符。如果路径第i个字符不是ch,那么这个格子不可能处在路径第i个位置。...如果路径第i个字符正好是ch,那么到相邻格子寻找路径第i+1个字符。除矩阵边界上格子之外,其他格子都有4个相邻格子,重复这个过程,直到路径所有字符都在矩阵中找到相应位置。

28120

矩阵路径

同一个单元格内字母不允许被重复使用。例如,在下面的 3×4 矩阵包含单词 "ABCCED"(单词字母已标出)。...board中找到是否存在字符串单词word,那么我们第1个步骤要做事情就是寻找单词word第一个字符board位置。...然后再以这个字符作为起点去匹配word其他字符。在这个对比过程,我们会执行一些“错误路径”。...通过回溯我们才能从错误路径跳脱出来,继续去寻找矩阵board下一个字符‘S’,那么后续我们第2行第4列找到了‘S’,然后发现可以找到一条“正确路径”,就可以返回结果为true。...\0'),那么如果发现是错误路径,可以再将经过格子值还原回去就可以了。

23720

​LeetCode刷题实战329:矩阵最长递增路径

算法重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !...今天和大家聊问题叫做 矩阵最长递增路径,我们先来看题面: https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/...给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。...你 不能 对角线 方向上移动或移动到 边界外(即不允许环绕)。 示例 ? 解题 ?...,如果觉得有所收获,请顺手点个在看或者转发吧,你们支持是我最大动力 。

32330

关于vim查找和替换

1,查找 normal模式下按下/即可进入查找模式,输入要查找字符串并按下回车。 Vim会跳转到第一个匹配。按下n查找下一个,按下N查找上一个。...set smartcase 将上述设置粘贴到你~/.vimrc,重新打开Vim即可生效 4,查找当前单词 normal模式下按下*即可查找光标所在单词(word), 要求每次出现前后为空白字符或标点符号...例如当前为foo, 可以匹配foo barfoo,但不可匹配foobarfoo。 这在查找函数名、变量名时非常有用。 按下g*即可查找光标所在单词字符序列,每次出现前后字符无要求。...即foo bar和foobarfoo均可被匹配到。 5,查找与替换 :s(substitute)命令用来查找和替换字符串。...^E与^Y是光标移动快捷键,参考: Vim如何快速进行光标移 大小写敏感查找 查找模式中加入\c表示大小写不敏感查找,\C表示大小写敏感查找

22.8K40

每日算法系列【LeetCode 329】矩阵最长递增路径

题目描述 给定一个整数矩阵,找出最长递增路径长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。你不能在对角线方向上移动或移动到边界外(即不允许环绕)。...题解 DFS+记忆化搜索 对于点 来说,以它为终点最长递增路径一定会经过上下左右四个点其一。...所以如果它四周点小于 ,就递归遍历四周点,然后以 为终点最长递增路径长度就是以四周小于它点为终点最长递增路径长度加 : 注意这里四周点首先不能超过边界,然后数值上必须小于 。...拓扑排序 把每个格子当作一个点,然后从数值小点向四周比它大点连一条有向边,最终一定会形成一个有向无环图,问题就转变成了求有向无环图中最长路径。...方法是先找到所有入度为 结点,然后放入一个队列,依次从队列里取出结点,从图中删除这些结点。然后图中就出现了新入度为 结点了,它们路径长度加 。接着重复上面的操作,直到最后没有结点。

1K10
领券