文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

寻找矩阵中的路径

2024-12-03 02:01

关注

前言

给定一个矩阵和一个字符串,如何从矩阵中寻找出这个字符串在矩阵中的路径?本文就跟大家分享下如何使用回溯法来解决这个问题,欢迎各位感兴趣的开发者阅读本文。

实现思路

我们先从题目给出的条件入手,逐步分析得出思路,矩阵就是一个二维数组,字符串可以切割成一个数组,我们要做的就是按顺序取出字符串中的每个字符,判断其是否在矩阵中,能否组成一条完整的路径出来。

举例分析

现有一个矩阵(如下所示),有一个字符串bfce,我们需要从矩阵中找出这个字符串在矩阵中所连接起来的路径。

  1. a  b  t  g 
  2. c  f  c  s 
  3. j  d  e  h 

我们从矩阵的[0][0]位置作为入口开始寻找,要查找的第1个字符为b:

保存每一步已找到元素在矩阵中的索引

最终路径为:[0][1]、[1][1]、[1][2]、[2][2]

思路分析

通过上述举例,我们可以总结出下述思路:

注意:我们在矩阵中找到与目标字符匹配的元素后,我们需要将这个位置的元素先存起来,然后再改成. 用于标识这个元素已经访问过了,当所有元素找到后再将存储起来的值进行还原。

实现代码

我们分析出思路后,接下来我们来看下实现代码,代码分为2部分:

主函数

主函数接受2个参数:路径矩阵、目标字符串

代码实现如下:

  1. export default class Backtracking { 
  2.   // 目标路径在矩阵中的索引 
  3.   private readonly pathIndex: Array
  4.  
  5.   constructor() { 
  6.     this.pathIndex = []; 
  7.   } 
  8.    
  9.   public findMatrixPath( 
  10.     matrix: Array>, 
  11.     target: string 
  12.   ): Array { 
  13.     if (target === "") { 
  14.       this.pathIndex.push("参数错误: 目标路径为空"); 
  15.       return this.pathIndex; 
  16.     } 
  17.     for (let i = 0; i < matrix.length; i++) { 
  18.       for (let j = 0; j < matrix[i].length; j++) { 
  19.         if (this.findPath(matrix, target, i, j, 0)) { 
  20.           return this.pathIndex; 
  21.         } 
  22.       } 
  23.     } 
  24.     // 未找到 
  25.     this.pathIndex.push("目标路径不存在于矩阵中"); 
  26.     return this.pathIndex; 
  27.   } 

寻找路径函数

寻找路径函数接受5个参数:路径矩阵、目标字符串、要寻找的行、要寻找的列、要寻找的字符索引

代码实现如下:

  1. private findPath( 
  2.   matrix: Array>, 
  3.   target: string, 
  4.   row: number, 
  5.   col: number, 
  6.   index: number 
  7. ): boolean { 
  8.   // 边界条件判断 
  9.   //  1. 行、列值越界直接返回false 
  10.   //  2. matrix[row][col]位置的元素与当前要查找的字符不等,证明这个路径走不通 
  11.   if ( 
  12.     row >= matrix.length || 
  13.     row < 0 || 
  14.     col >= matrix[0].length || 
  15.     col < 0 || 
  16.     matrix[row][col] != target[index
  17.   ) { 
  18.     return false
  19.   } 
  20.   // 所有字符都已查找完成 
  21.   if (index === target.length - 1) { 
  22.     // 保存最后一个字符在矩阵中的坐标 
  23.     this.pathIndex.unshift(`[${row}][${col}]`); 
  24.     return true
  25.   } 
  26.   // 保存当前坐标值 
  27.   const tmp = matrix[row][col]; 
  28.   // 修改当前坐标的值,标识当前坐标点已经被寻找 
  29.   matrix[row][col] = "."
  30.   // 开始递归: 沿着当前坐标的上下左右4个方向查找 
  31.   const res: boolean = 
  32.     this.findPath(matrix, target, row + 1, col, index + 1) || 
  33.     this.findPath(matrix, target, row - 1, col, index + 1) || 
  34.     this.findPath(matrix, target, row, col + 1, index + 1) || 
  35.     this.findPath(matrix, target, row, col - 1, index + 1); 
  36.   // 本轮递归完成,找到了当前要查找字符在矩阵中的位置 
  37.   if (res) { 
  38.     // 保存当前要查找字符的坐标点 
  39.     this.pathIndex.unshift(`[${row}][${col}]`); 
  40.   } 
  41.   // 递归完成,复原当前坐标 
  42.   matrix[row][col] = tmp; 
  43.   return res; 

完整代码请移步:Backtracking.ts

编写测试用例

接下来,我们将上述例子代入我们实现的函数中,测试下是否正确。

  1. import Backtracking from "../Backtracking.ts"
  2.  
  3. const pathArr = [ 
  4.   ["a""b""t""g"], 
  5.   ["c""f""c""s"], 
  6.   ["j""d""e""h"
  7. ]; 
  8. const target = "bfce"
  9. const backtracking = new Backtracking(); 
  10. const findResult = backtracking.findMatrixPath(pathArr, target); 
  11. console.log(`${target}在矩阵中的路径索引为`, findResult); 

执行结果如下所示:

 

来源:神奇的程序员K 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯