题目描述

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

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

思路:

首先看到这个题目,思路很明确,使用DFS递归的回溯剪枝思想,即添加一些判断条件使得程序不再递归下去。首先对于matrix中的每一个都可能是起点,需要遍历。由题可知,只要找到一条路径,即可返回true;

对于从每一个点开始的子路径,因为使用递归,我们只需知道在这一步该怎么做即可,不用管之后该怎么做。同时找到一个递归的出口即可。

0.根据给定数组,初始化一个标志位数组,初始化为false,表示未走过,true表示已经走过,不能走第二次

1.根据行数和列数,遍历数组,先找到一个与str字符串的第一个元素相匹配的矩阵元素,进入judge

2.根据i和j先确定一维数组的位置,因为给定的matrix是一个一维数组

3.确定递归终止条件:越界,当前找到的矩阵值不等于数组对应位置的值,已经走过的,这三类情况,都直接false,说明这条路不通

4.若k,就是待判定的字符串str的索引已经判断到了最后一位,此时说明是匹配成功的

5.下面就是本题的精髓,递归不断地寻找周围四个格子是否符合条件,只要有一个格子符合条件,就继续再找这个符合条件的格子的四周是否存在符合条件的格子,直到k到达末尾或者不满足递归条件就停止。

6.走到这一步,说明本次是不成功的,我们要还原一下标志位数组index处的标志位,进入下一轮的判断。

python 实现:

# -*- coding:utf-8 -*-
class Solution:def hasPath(self, matrix, rows, cols, path):# write code hereif not matrix or not path:return Falseindex_arr = [i for i in range(len(matrix)) if matrix[i]==path[0]]for i in index_arr:if self.findPath(matrix,rows,cols,path,i,[]):return Truereturn Falsedef findPath(self, matrix, rows, cols, path, index, visited):if index in visited:return Falseif index < 0 or index >= len(matrix):return Falseif not path:return Falseif matrix[index] != path[0]:return False# 如果前面的情况都不存在,当前元素与path中第一个元素相等,此时# 如果path的长度等于1if len(path) == 1:return Truevisited.append(index)# 第一个元素下标0只能向右向下if index == 0:return self.findPath(matrix,rows,cols,path[1:],index+1,visited) or self.findPath(matrix, rows, cols,path[1:],index+cols,visited)# 最后一个元素if index == len(matrix) - 1:return self.findPath(matrix, rows, cols, path[1:], index - 1, visited) or self.findPath(matrix, rows, cols,path[1:],index-cols,visited)# 元素在第一列if index % cols == 0:return self.findPath(matrix, rows, cols, path[1:], index + 1, visited) or self.findPath(matrix, rows, cols,path[1:],index-cols,visited) or self.findPath(matrix, rows, cols, path[1:], index + cols, visited)# 元素在最后一列if (index + 1) % cols == 0:return self.findPath(matrix, rows, cols, path[1:], index - 1, visited) or self.findPath(matrix, rows, cols, path[1:], index - cols, visited) or self.findPath(matrix, rows, cols, path[1:], index + cols, visited)else:return self.findPath(matrix, rows, cols, path[1:], index + 1, visited) or self.findPath(matrix, rows, cols,path[1:], index - 1, visited) or self.findPath(matrix, rows, cols, path[1:], index - cols, visited) or self.findPath(matrix, rows, cols, path[1:],index + cols, visited)

回溯法是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

回溯法可以理解为通过选择不同的岔路口寻找目的地,一个岔路口一个岔路口的去尝试找到目的地。如果走错了路,继续返回来找到岔路口的另一条路,直到找到目的地。

回溯法与递归:

回溯法是一种思想,递归是一种形式

遍历矩阵每一行穷举_六十三---矩阵中的路径相关推荐

  1. 遍历矩阵每一行穷举_[LeetCode] 566. 重塑矩阵

    题目链接: https://leetcode-cn.com/problems/reshape-the-matrix 难度:简单 通过率:61.6% 题目描述: 在MATLAB中,有一个非常有用的函数 ...

  2. 遍历矩阵每一行穷举_LeetCode:二维数组—旋转矩阵

    点击上方蓝字关注我们 题目描述:"给衣服N*N的矩阵表示图像,其中每个像素的大小为4字节,设计一个算法,图像旋转90度" 示例: matrix=[[1, 2, 3],[4, 5, ...

  3. java获取数组穷举_递归算法求解遍历(或穷举)问题

    递归算法求解遍历(或穷举)问题 递归问题可以理解为遍历问题,必须遍历出所有的数据来,才能进行相应的运算,比如Fibonacci问题.阶乘问题,必须把每一步的值都遍历出来,然后才能做加法或乘法. 递归算 ...

  4. java获取数组穷举_被BAT疯抢的Java工程师,都是怎么拿到年薪50W的offer

    怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名遭到BAT疯抢的架构师. 那么遭到BAT疯抢的架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员也是工作三五年之 ...

  5. Java实现穷举_对数器实现(C++)

    主要参考左神的JAVA版的对数器实现,主要分为以下几个步骤: 产生随机数组或者字符串,本例产生随机数组 找一个绝对正确的方法,不管复杂度 对比自己实现的方法和绝对正确的方法的结果,若相同,则返回tru ...

  6. 矩阵乘法 算法训练 试题_线性代数入门——矩阵乘法的定义及其意义

    系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养.线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释.在内 ...

  7. python中filepath路径怎么写_详解Python中的路径问题

    1. 绝对路径引入 Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止.下面命令可以查看当前的搜索路径: import sys print(sys.path) sys.pa ...

  8. java获取数组穷举_请教一下两个数组各取一个元素生成新的数组的穷举算法设计?...

    题目描述 比如第一组数是:A B C D E 第二组是:1 2 3 4 两组数不一定是对称的,第一组数量比第二组可能多也可能少也可能相同,输出结果举例如下:A1 B2 C3 D4 (只组合不排序),要 ...

  9. 怎么根据矩阵判断极大无关组_怎么根据矩阵判断极大无关组_什么是极大无关组?怎么判别?...

    展开全部 向量组的极大无关组满足2个条件:62616964757a686964616fe59b9ee7ad9431333431353366 1.自身线性无关. 2.向量组中所有向量可由它线性表示. 例 ...

最新文章

  1. 西湖大学能招本科生了!首次确定 5 大本科专业
  2. 你看的每一篇Nature论文,都是这样出炉的!
  3. android自定义View-垂直滚动的TextView
  4. 小程序button引导用户授权
  5. Asp.Net操作Cookie总结
  6. 如何在电脑上制作请假条表格_条码标签打印软件如何制作请假表
  7. K-means聚类分析算法(二)
  8. 命令行启动mssqlserver服务
  9. C# 调用并执行SQL脚本文件
  10. Linux vi 命令创建,Linux vi命令 创建文件
  11. java 汉字拼音首字母_java获取汉字拼音首字母
  12. vmware linux虚拟机网络配置
  13. 从勾股定理看机器学习
  14. ES的ik分词器ik_smart和ik_max_word区别
  15. 杭州 职称 计算机免试,浙职称评审政策调整外语计算机免考年限有变动
  16. RK3288 USB触摸屏与USB摄像头同时使用时触摸卡顿
  17. EasyAR尝鲜系列教程之视频播放功能的实现
  18. 设置custom debug keystore
  19. 【2022持续更新】大数据最全知识点整理-HDFS篇
  20. 百特搭入选甲子光年《2022中国企业低代码/无代码产品应用与实践研究》最佳实践代表厂商

热门文章

  1. android 第三方框架
  2. [Offer收割]编程练习赛12 题目1 : 歌德巴赫猜想
  3. intel simd 资料
  4. Win10系统下面的TR1008解决方案
  5. [转]企业网站首页设计常见的6种布局方式
  6. Flex中ItemRenderer项目渲染器的两个重要问题
  7. Bailian2932 期末考试第三题——最大最小数之差【文本+进制】
  8. HDU2186 一定要记住我爱你【水题】
  9. Java实现的大整数分解Pollard's rho算法程序
  10. Spark RDD 之间的依赖关系