国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

尋找矩陣中的路徑

開(kāi)發(fā) 架構(gòu)
給定一個(gè)矩陣和一個(gè)字符串,如何從矩陣中尋找出這個(gè)字符串在矩陣中的路徑?本文就跟大家分享下如何使用回溯法來(lái)解決這個(gè)問(wèn)題,歡迎各位感興趣的開(kāi)發(fā)者閱讀本文。

[[411074]]

本文轉(zhuǎn)載自微信公眾號(hào)「神奇的程序員K」,作者神奇的程序員K。轉(zhuǎn)載本文請(qǐng)聯(lián)系神奇的程序員K公眾號(hào)。

前言

給定一個(gè)矩陣和一個(gè)字符串,如何從矩陣中尋找出這個(gè)字符串在矩陣中的路徑?本文就跟大家分享下如何使用回溯法來(lái)解決這個(gè)問(wèn)題,歡迎各位感興趣的開(kāi)發(fā)者閱讀本文。

實(shí)現(xiàn)思路

我們先從題目給出的條件入手,逐步分析得出思路,矩陣就是一個(gè)二維數(shù)組,字符串可以切割成一個(gè)數(shù)組,我們要做的就是按順序取出字符串中的每個(gè)字符,判斷其是否在矩陣中,能否組成一條完整的路徑出來(lái)。

舉例分析

現(xiàn)有一個(gè)矩陣(如下所示),有一個(gè)字符串bfce,我們需要從矩陣中找出這個(gè)字符串在矩陣中所連接起來(lái)的路徑。

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

我們從矩陣的[0][0]位置作為入口開(kāi)始尋找,要查找的第1個(gè)字符為b:

  • 0,0 位置的元素是a,與目標(biāo)值不匹配,繼續(xù)尋找0,1位置
  • 0,1 位置的元素是是b,與目標(biāo)值匹配,繼續(xù)查找第2個(gè)字符f
    • 更新尋找方向,向下查找
  • 1,1 位置的元素是f,與目標(biāo)值匹配,繼續(xù)查找第3個(gè)字符c
    • 更新尋找方向,向下查找
  • 2,1 位置的元素是d,與目標(biāo)值不匹配,回到上一步1,1位置
    • 更新尋找方向,向上查找,
    • 0,0位置的值已經(jīng)尋找過(guò)了,回到上一步1,1位置
    • 更新尋找方向,向右查找
  • 1,2 位置的元素是c,與目標(biāo)值匹配,繼續(xù)查找第4個(gè)字符e
    • 更新尋找方向,向下查找
  • 2,2 位置的元素是e,與目標(biāo)值匹配,所有字符尋找完畢,該路徑存在與矩陣中

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

  • [2,2]位置
  • [1,2]位置
  • [1,1]位置
  • [0,1]位置

最終路徑為:[0][1]、[1][1]、[1][2]、[2][2]

思路分析

通過(guò)上述舉例,我們可以總結(jié)出下述思路:

  • 尋找一個(gè)切入點(diǎn),從第一個(gè)字符開(kāi)始尋找其在矩陣中的位置
  • 進(jìn)入矩陣后,每一步都會(huì)有4個(gè)移動(dòng)方向:下、上、右、左
  • 每移動(dòng)一個(gè)方向,都會(huì)判斷移動(dòng)后位置的值是否與當(dāng)前要查找的字符是否相等
    • 如果相等,則標(biāo)識(shí)當(dāng)前位置的元素為已訪問(wèn)狀態(tài),沿著四個(gè)移動(dòng)方向繼續(xù)尋找下一個(gè)字符
    • 如果不相等,則回到上一步的位置點(diǎn),嘗試其他的三個(gè)方向是否有匹配的元素
  • 重復(fù)步驟3,直至所有匹配字符的四個(gè)方向都被移動(dòng)
    • 字符串中的全部字符都被找到后,則取出每一步的正確索引位置將其保存起來(lái)
    • 四個(gè)方向都被移動(dòng)后,仍未找到與字符所匹配的元素,則證明該字符串不存在于矩陣中

注意:我們?cè)诰仃囍姓业脚c目標(biāo)字符匹配的元素后,我們需要將這個(gè)位置的元素先存起來(lái),然后再改成. 用于標(biāo)識(shí)這個(gè)元素已經(jīng)訪問(wèn)過(guò)了,當(dāng)所有元素找到后再將存儲(chǔ)起來(lái)的值進(jìn)行還原。

實(shí)現(xiàn)代碼

我們分析出思路后,接下來(lái)我們來(lái)看下實(shí)現(xiàn)代碼,代碼分為2部分:

  • 主函數(shù),用于參數(shù)規(guī)則判斷、尋找切入點(diǎn)、返回找到的路徑
  • 尋找路徑函數(shù),用于在矩陣中尋找每一個(gè)字符

主函數(shù)

主函數(shù)接受2個(gè)參數(shù):路徑矩陣、目標(biāo)字符串

  • 我們需要先對(duì)參數(shù)進(jìn)行判空
  • 遍歷矩陣從0,0位置開(kāi)始尋找路徑
  • 路徑找到則返回路徑索引,否則返回目標(biāo)路徑不存在

代碼實(shí)現(xiàn)如下:

  1. export default class Backtracking { 
  2.   // 目標(biāo)路徑在矩陣中的索引 
  3.   private readonly pathIndex: Array<string>; 
  4.  
  5.   constructor() { 
  6.     this.pathIndex = []; 
  7.   } 
  8.    
  9.   public findMatrixPath( 
  10.     matrix: Array<Array<string>>, 
  11.     target: string 
  12.   ): Array<string> { 
  13.     if (target === "") { 
  14.       this.pathIndex.push("參數(shù)錯(cuò)誤: 目標(biāo)路徑為空"); 
  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("目標(biāo)路徑不存在于矩陣中"); 
  26.     return this.pathIndex; 
  27.   } 

尋找路徑函數(shù)

尋找路徑函數(shù)接受5個(gè)參數(shù):路徑矩陣、目標(biāo)字符串、要尋找的行、要尋找的列、要尋找的字符索引

  • 首先,我們需要判斷下要尋找的行、列是否超越矩陣的界限
  • 矩陣中要尋找的行、列位置的元素與要尋找的字符不相等則直接返回false
  • 判斷所有字符是否都查找完成
    • 完成的話則存儲(chǔ)行、列索引,返回true
    • 未完成則保存當(dāng)前行、列處的值、修改該位置的值為.用于標(biāo)識(shí)為已訪問(wèn)狀態(tài)
  • 從當(dāng)前坐標(biāo)點(diǎn)位置沿著其四個(gè)方向:下、上、右、下進(jìn)行查找
  • 查找完成后保存已找到字符的坐標(biāo)點(diǎn),還原當(dāng)前位置所保存的值

代碼實(shí)現(xiàn)如下:

  1. private findPath( 
  2.   matrix: Array<Array<string>>, 
  3.   target: string, 
  4.   row: number, 
  5.   col: number, 
  6.   index: number 
  7. ): boolean { 
  8.   // 邊界條件判斷 
  9.   //  1. 行、列值越界直接返回false 
  10.   //  2. matrix[row][col]位置的元素與當(dāng)前要查找的字符不等,證明這個(gè)路徑走不通 
  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.     // 保存最后一個(gè)字符在矩陣中的坐標(biāo) 
  23.     this.pathIndex.unshift(`[${row}][${col}]`); 
  24.     return true
  25.   } 
  26.   // 保存當(dāng)前坐標(biāo)值 
  27.   const tmp = matrix[row][col]; 
  28.   // 修改當(dāng)前坐標(biāo)的值,標(biāo)識(shí)當(dāng)前坐標(biāo)點(diǎn)已經(jīng)被尋找 
  29.   matrix[row][col] = "."
  30.   // 開(kāi)始遞歸: 沿著當(dāng)前坐標(biāo)的上下左右4個(gè)方向查找 
  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.   // 本輪遞歸完成,找到了當(dāng)前要查找字符在矩陣中的位置 
  37.   if (res) { 
  38.     // 保存當(dāng)前要查找字符的坐標(biāo)點(diǎn) 
  39.     this.pathIndex.unshift(`[${row}][${col}]`); 
  40.   } 
  41.   // 遞歸完成,復(fù)原當(dāng)前坐標(biāo) 
  42.   matrix[row][col] = tmp; 
  43.   return res; 

完整代碼請(qǐng)移步:Backtracking.ts

編寫(xiě)測(cè)試用例

接下來(lái),我們將上述例子代入我們實(shí)現(xiàn)的函數(shù)中,測(cè)試下是否正確。

  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); 

執(zhí)行結(jié)果如下所示:

 

責(zé)任編輯:武曉燕 來(lái)源: 神奇的程序員K
相關(guān)推薦

2012-08-10 09:59:47

2011-02-17 09:58:16

WindowsUbuntu

2017-05-22 10:54:56

深度學(xué)習(xí)CNNMNIST

2014-10-13 17:04:28

IT運(yùn)維管理

2017-12-26 14:27:24

2022-02-18 10:34:58

自動(dòng)駕駛

2009-04-09 10:17:00

2014-10-20 11:14:43

2018-05-09 12:27:34

Linux命令尋找文件

2010-12-20 12:33:55

2012-05-10 17:12:43

創(chuàng)新工場(chǎng)燈泡工場(chǎng)

2021-07-06 07:01:35

旋轉(zhuǎn)數(shù)組數(shù)字

2023-01-03 11:47:47

2021-12-04 23:00:01

人工智能數(shù)據(jù)數(shù)字化轉(zhuǎn)型

2021-04-01 16:36:07

macOS文件夾磁盤(pán)

2022-10-24 15:56:55

PythonPyTorchGPU 計(jì)算

2024-10-23 09:05:07

PixijsMatrixTransform

2020-05-13 15:10:04

矩陣乘法深度學(xué)習(xí)人工智能-

2021-06-02 09:36:49

物聯(lián)網(wǎng)惡意軟件IoT

2021-06-03 10:16:15

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)設(shè)備惡意軟件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久久亚洲精品成人网小说| 最新日韩精品| 欧美日韩国产另类不卡| av影片在线| 欧美最顶级的aⅴ艳星| 亚洲免费一区二区| 99爱免费视频| 五月婷婷在线观看| 中文字幕不卡av| 欧美色图另类小说| 在线中文字幕亚洲| 国产日韩亚洲欧美在线| 亚洲激情五月婷婷| 亚洲精品国产精品国产| 91精品久久久久久久久久入口| 黄色一级大片在线免费看产| 日韩在线观看免费全| 狠狠噜噜久久| 羞羞的视频网站| 亚洲毛片在线看| 综合日韩在线| 97福利电影| 中文字幕日韩av电影| 午夜在线一区| 青青草手机在线| 69视频在线播放| 一区二区三区视频观看| 国产日韩欧美综合| 成人av网站免费观看| 114国产精品久久免费观看| 国产白丝精品91爽爽久久| 男人的天堂在线| 欧美激情亚洲精品| 国产一区二三区好的| 国产在线视频网址| 51ⅴ精品国产91久久久久久| 久久www免费人成看片高清| 日本午夜在线| 国产精品6699| 国产日韩一级二级三级| 岛国在线视频网站| 精品日韩电影| 日韩欧美精品免费在线| 亚洲盗摄视频| 国产中文欧美精品| 久久久精品蜜桃| 日韩和的一区二在线| 神马影院一区二区| 欧美日韩视频不卡| 伊人青青综合网| 天天噜天天色| 亚洲午夜激情av| 四虎精品在永久在线观看| 欧美激情久久久久| 成人动漫视频在线| 黑人巨大精品| 操bbb操bbb| 亚洲精品一区二区三区不| 日韩精品亚洲一区| 在线视频中文字幕第一页| 国内一区二区三区在线视频| 一本大道久久精品懂色aⅴ| 日韩免费av| 在线免费看污| 91精品视频在线播放| 精品国产999| 欧美在线三级| av在线女优影院| 国产亚洲精品美女久久久m| 一区二区三区丝袜| 成人3d精品动漫精品一二三| 免费av网页| 国产一区视频在线播放| 亚洲成人在线观看视频| av片在线观看免费| 茄子视频成人在线观看 | 毛片在线视频| 亚洲网站在线播放| 成人av在线资源| 国产一区二区三区黄网站| 亚欧在线免费观看| 国产精品大陆在线观看| 91久久精品一区二区| 国产亚洲精品久久久久婷婷瑜伽| 国产婷婷视频在线| 熟妇熟女乱妇乱女网站| 草民午夜欧美限制a级福利片| 久久先锋影音av| 奇米狠狠一区二区三区| 四虎精品成人免费网站| 精品综合久久| 欧美日韩视频| 欧美色图首页| 91看片在线观看| 天堂资源在线亚洲资源| 亚洲高清在线一区| 成人黄动漫网站| av免费精品一区二区三区| 日韩午夜小视频| 成人免费高清视频在线观看| 国产精品网在线观看| 草久在线视频| 免费日韩av电影| www.亚洲天堂| 亚洲成av人综合在线观看| 亚洲一区国产| 在线免费观看亚洲| 992tv成人国产福利在线| 精品一区二区三区国产| 精品无人国产偷自产在线| 国产欧美精品一区aⅴ影院 | 视频一区二区不卡| 国产日本亚洲| 亚洲人性生活视频| 亚洲av综合色区| 国产精品十八以下禁看| 亚洲精品99久久久久中文字幕| 久久日韩粉嫩一区二区三区| 亚洲香蕉av| 四虎精品一区二区免费| 黄色av网站在线| 国产免费观看高清视频| av一区二区三区免费| 亚洲人成五月天| 狠狠色香婷婷久久亚洲精品| 热久久一区二区| 精品一区三区| 中文字幕在线直播| 亚洲成人男人天堂| 九九热只有这里有精品| 亚洲精品免费网站| 久久综合久久美利坚合众国| 欧美三区在线视频| 中文幕一区二区三区久久蜜桃| 久久精品男女| 成人情趣视频| 国产999精品在线观看| 国内外激情在线| 国产精品三级a三级三级午夜| 亚洲一区二区三区在线观看视频| 国产精品美女久久久久av超清| 一区二区成人精品| 欧美视频免费在线观看| 久久久噜噜噜久久中文字幕色伊伊| 国产亚洲在线| 欧美艳星介绍134位艳星| 2019年精品视频自拍| 色综合久久影院| 最近2018中文字幕免费在线视频| 黄色三级中文字幕| 久久久久se| 国产精品天天狠天天看| 久久国产精品偷| 亚洲精品在线观看www| 欧美日韩中文国产| 亚洲欧美一区二区三区极速播放 | 青草伊人久久| 91九色在线播放| 国产片在线观看| 中文字幕www| 成人一区二区免费视频| 亚洲福利av在线| 国产精品污www一区二区三区| 欧美一区二区三区…… | 亚洲一区二区av电影| 成人听书哪个软件好| 天堂va蜜桃一区二区三区| 亚洲女同一区| 日韩欧美一区二区三区在线视频| 精品精品视频| av成人在线观看| 色吧亚洲日本| 精精国产xxx在线视频app| 日本韩国在线视频爽| 蜜桃视频在线观看网站| 在线香蕉视频| 蜜臀一区二区三区| y4480在线8影院| 久草免费在线播放| 国产va在线| 久久mv成人精品亚洲动漫| 亚洲性图一区二区| 一道本视频在线观看| 一区二区传媒有限公司| 日韩亚洲欧美视频| 免费观看国产精品视频| 狠狠97人人婷婷五月| 午夜精品久久久内射近拍高清| a在线视频观看| 苍井空浴缸大战猛男120分钟| 日本日本19xxxⅹhd乱影响| 欧美二区在线视频| 青青艹视频在线| 免费裸体美女网站| 午夜在线观看av| 久草在线国产| 宅男午夜电影| 欧洲视频在线免费观看| av在线电影免费观看| 黄色在线播放网站|