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

回溯算法-機(jī)器人的運(yùn)動(dòng)范圍

開發(fā) 算法
有一個(gè)矩陣,機(jī)器人可以從坐標(biāo)(0,0)的格子開始移動(dòng),它每次可以向左、右、上、下移動(dòng)一格,但是不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于K的格子,求這個(gè)機(jī)器人總共能走多少個(gè)格子以及它的行動(dòng)軌跡。

[[415476]]

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

前言

有一個(gè)矩陣,機(jī)器人可以從坐標(biāo)(0,0)的格子開始移動(dòng),它每次可以向左、右、上、下移動(dòng)一格,但是不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于K的格子,求這個(gè)機(jī)器人總共能走多少個(gè)格子以及它的行動(dòng)軌跡。

本文就跟大家分享下這個(gè)問題的解決方案 ,歡迎各位感興趣的開發(fā)者閱讀本文。

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

在上一篇講解尋找矩陣中的路徑文章中,我們學(xué)會(huì)了使用回溯算法來訪問矩陣中的格子,本文要討論的這個(gè)問題在訪問格子之前做了一層判斷,如果滿足條件就能進(jìn)入,不滿足就無法進(jìn)入。

我們要做的這層判斷為:計(jì)算出待訪問格子的坐標(biāo)的數(shù)位之和,如果其大于K(最大活動(dòng)范圍)則不能訪問。

數(shù)位之和:即取出數(shù)字中每個(gè)位置的值,將其相加得出的結(jié)果。例如:19的數(shù)位之和就是1 + 9 = 10。

判斷當(dāng)前格子是否已訪問

首先,我們需要?jiǎng)?chuàng)建一個(gè)與原矩陣大小相同的矩陣,用于標(biāo)識(shí)機(jī)器人是否已走這個(gè)格子。

在js中無法直接創(chuàng)建指定大小的二維數(shù)組,創(chuàng)建思路如下:

  • 以矩陣的長(zhǎng)度為大小創(chuàng)建一個(gè)數(shù)組
  • 遍歷創(chuàng)建好的數(shù)組,再以矩陣的第0號(hào)數(shù)組的長(zhǎng)度為大小創(chuàng)建數(shù)組,賦值給遍歷到的每一項(xiàng)。

判斷格子是否可進(jìn)入

在訪問格子時(shí),我們需要判斷下要訪問的格子是否能進(jìn)入,我們需要計(jì)算出行坐標(biāo)與列坐標(biāo)的數(shù)位之和,然后將其相加,判斷相加后的結(jié)果是否大于機(jī)器人的最大活動(dòng)范圍(K)。

計(jì)算數(shù)位之和有兩種做法:

  • 將數(shù)字轉(zhuǎn)為字符串,遍歷取出每個(gè)字符將其轉(zhuǎn)為數(shù)字后再相加
  • 對(duì)數(shù)字進(jìn)行模運(yùn)算,將其結(jié)果相加,再對(duì)數(shù)字本身進(jìn)行/10操作,直至數(shù)字小于等于0

開始移動(dòng)機(jī)器人

移動(dòng)機(jī)器人時(shí),我們需要7個(gè)參數(shù):

  • 矩陣的總行數(shù)
  • 矩陣的總列數(shù)
  • 即將進(jìn)入格子的行坐標(biāo)
  • 即將進(jìn)入格子的列坐標(biāo)
  • 最大活動(dòng)范圍
  • 訪問標(biāo)識(shí)矩陣
  • 路徑矩陣

首先,我們需要進(jìn)行邊界條件判斷(遞歸的終止條件),條件滿足代表該格子無法訪問,可行走格子為0(直接返回0):

  • 待訪問格子的行坐標(biāo)大于矩陣的總行數(shù)
  • 待訪問格子的行坐標(biāo)小于0
  • 待訪問格子的列坐標(biāo)大于矩陣的總列數(shù)
  • 待訪問格子的列坐標(biāo)小于0
  • 當(dāng)前格子已經(jīng)被訪問
  • 當(dāng)前格子不能進(jìn)入

如果上述條件都滿足則表示當(dāng)前格子可以訪問,保存當(dāng)前格子中的值到行動(dòng)軌跡中,標(biāo)識(shí)當(dāng)前格子為已訪問狀態(tài),已行走格子數(shù)+1,并遞歸嘗試當(dāng)前格子的其它四個(gè)方向的格子能否進(jìn)入。

當(dāng)遞歸棧清空后,我們也就得到了機(jī)器人總共可以進(jìn)入的格子總數(shù)以及它的行動(dòng)軌跡。

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

接下來,我們將上述思路轉(zhuǎn)換為TypeScript代碼。

格子能否進(jìn)入函數(shù)

我們先來看下判斷當(dāng)前格子能否進(jìn)入的函數(shù)實(shí)現(xiàn),如下所示:

  1.   /** 
  2.    * 判斷機(jī)器人能否進(jìn)入目標(biāo)格子 
  3.    * @param row 行坐標(biāo) 
  4.    * @param col 列坐標(biāo) 
  5.    * @param target 臨界點(diǎn) 
  6.    * @private 
  7.    */ 
  8.   private checkPath(row: number, col: number, target: number): boolean { 
  9.     // 兩坐標(biāo)的數(shù)位之和必須小于等于臨界點(diǎn) 
  10.     return sumOfDigits(row) + sumOfDigits(col) <= target; 
  11.   } 
  12.  
  13. // 轉(zhuǎn)字符串實(shí)現(xiàn) 
  14. export function sumOfDigits(target: number): number { 
  15.   let finalVal = 0; 
  16.   const computeVal = target.toString(); 
  17.   for (let i = 0; i < computeVal.length; i++) { 
  18.     finalVal += Number(computeVal[i]); 
  19.   } 
  20.   return finalVal; 
  21.  
  22. // 數(shù)位之和 - 模運(yùn)算實(shí)現(xiàn) 
  23. export function sumOfDigitsForModular(target: number): number { 
  24.   let finalVal = 0; 
  25.   while (target > 0) { 
  26.     finalVal += Math.floor(target % 10); 
  27.     target /= 10; 
  28.   } 
  29.   return finalVal; 

移動(dòng)機(jī)器人函數(shù)

移動(dòng)機(jī)器人至指定格子實(shí)現(xiàn)代碼如下所示:

  1. /** 
  2.  * 開始移動(dòng)機(jī)器人 
  3.  * @param rows 矩陣總行數(shù) 
  4.  * @param cols 矩陣總列數(shù) 
  5.  * @param row 待進(jìn)入格子的行坐標(biāo) 
  6.  * @param col 待進(jìn)入格子的列坐標(biāo) 
  7.  * @param threshold 最大活動(dòng)范圍 
  8.  * @param isVisited 訪問標(biāo)識(shí)矩陣 
  9.  * @param matrix 路徑矩陣 
  10.  * @private 
  11.  */   
  12. rivate startMoving( 
  13.   rows: number, 
  14.   cols: number, 
  15.   row: number, 
  16.   col: number, 
  17.   threshold: number, 
  18.   isVisited: Array<Array<boolean>>, 
  19.   matrix: Array<Array<T>> 
  20. ): number { 
  21.   // 邊界條件判斷 
  22.   if ( 
  23.     row >= rows || 
  24.     row < 0 || 
  25.     col >= cols || 
  26.     col < 0 || 
  27.     isVisited[row][col] || 
  28.     !this.checkPath(row, col, threshold) 
  29.   ) { 
  30.     return 0; 
  31.   } 
  32.   // 記錄當(dāng)前訪問的格子內(nèi)容 
  33.   this.path += `${matrix[row][col]} -> `; 
  34.   // 標(biāo)識(shí)當(dāng)前格子已被訪問 
  35.   isVisited[row][col] = true
  36.   // 格子訪問數(shù)量+1 
  37.   return ( 
  38.     1 + 
  39.     this.startMoving(rows, cols, row + 1, col, threshold, isVisited, matrix) + 
  40.     this.startMoving(rows, cols, row, col + 1, threshold, isVisited, matrix) + 
  41.     this.startMoving(rows, cols, row - 1, col, threshold, isVisited, matrix) + 
  42.     this.startMoving(rows, cols, row, col - 1, threshold, isVisited, matrix) 
  43.   ); 

主函數(shù)

最后,我們來看下主函數(shù)的實(shí)現(xiàn),如下所示:

  1. /** 
  2.  * 題目: 
  3.  * 地上有一個(gè)m行n列的方格。 
  4.  * 一個(gè)機(jī)器人從坐標(biāo)(0,0)的格子開始移動(dòng), 
  5.  * 它每次可以向左、右、上、下移動(dòng)一格,但不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。 
  6.  * 例如,當(dāng)k為18時(shí),機(jī)器人能夠進(jìn)入方格 (35,37),因?yàn)?+5+3+7=18。 
  7.  * 但它不能進(jìn)入方格(35,38),因?yàn)?+5+3+8=19. 請(qǐng)問該機(jī)器人能夠到達(dá)多少個(gè)格子? 
  8.  * @param matrix 矩陣 
  9.  * @param threshold 臨界點(diǎn)(最大活動(dòng)范圍) 
  10.  */ 
  11. public movingCount(matrix: Array<Array<T>>, threshold = 0): number { 
  12.   if (threshold < 0 || matrix.length <= 0) { 
  13.     return 0; 
  14.   } 
  15.   // 獲取方格的總行數(shù)與總列數(shù) 
  16.   const rows = matrix.length; 
  17.   const cols = matrix[0].length; 
  18.   // 創(chuàng)建標(biāo)記數(shù)組,用于標(biāo)識(shí)格子是否被訪問 
  19.   const isVisited: Array<Array<boolean>> = new Array(rows); 
  20.   for (let i = 0; i < isVisited.length; i++) { 
  21.     isVisited[i] = new Array(cols); 
  22.   } 
  23.   // 從0,0位置開始移動(dòng),計(jì)算總的移動(dòng)格子數(shù)量 
  24.   return this.startMoving(rows, cols, 0, 0, threshold, isVisited, matrix); 

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

編寫測(cè)試用例

接下來,我們構(gòu)造一個(gè)矩陣來驗(yàn)證下上述代碼能否正確執(zhí)行,如下所示:

  1. const pathArr = [ 
  2.   ["a""b""t""g"], 
  3.   ["c""f""c""s"], 
  4.   ["j""d""e""h"
  5. ]; 
  6.  
  7. const backtracking = new Backtracking<string>(); 
  8. const totalCount = backtracking.movingCount(pathArr, 4); 
  9. const path = backtracking.path; 
  10. console.log( 
  11.   "機(jī)器人總共可走的格子總數(shù)為: "
  12.   totalCount, 
  13.   ",運(yùn)動(dòng)軌跡為: "
  14.   path.substr(0, path.length - 3) 
  15. ); 

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

 

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

2021-10-20 10:48:30

機(jī)器人人工智能算法

2019-06-26 23:27:33

機(jī)器人物聯(lián)網(wǎng)應(yīng)用IOT

2020-10-15 15:42:00

人工智能

2015-12-10 21:49:32

IM機(jī)器人

2025-08-18 18:27:09

機(jī)器人中國(guó)足球票價(jià)

2015-07-28 09:36:11

機(jī)器人

2021-08-19 15:44:20

機(jī)器人人工智能機(jī)器學(xué)習(xí)

2021-07-22 10:17:55

加密機(jī)器人加密貨幣機(jī)器人

2020-09-24 10:49:50

機(jī)器人人工智能系統(tǒng)

2017-03-28 12:21:21

機(jī)器人定義

2022-07-28 11:26:41

人工智能機(jī)器人

2012-03-08 09:42:16

開源軟件Linux

2021-04-08 09:33:02

機(jī)器人物聯(lián)網(wǎng)技術(shù)物聯(lián)網(wǎng)

2020-04-09 09:56:55

機(jī)器人導(dǎo)航框架

2021-07-19 09:11:05

機(jī)器人人工智能算法

2021-03-25 09:25:55

機(jī)器人人工智能系統(tǒng)

2019-11-06 11:40:19

機(jī)器人人工智能系統(tǒng)
點(diǎn)贊
收藏

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

天堂аⅴ在线最新版在线| 国产三级伦理在线| 国产在线精品一区二区夜色| 久久全国免费视频| 成人在线观看免费播放| 国产精品调教视频| 欧美日韩另类一区| 午夜成人影视| 一区二区欧美视频| 波多野结衣天堂| 成人国产精品免费观看| 喜爱夜蒲2在线| 久久69国产一区二区蜜臀| 久久99精品久久久久久久青青日本| 国内精品久久久久久久影视简单| 欧美日韩成人在线视频| 91av一区| 日韩成人中文字幕| av剧情在线观看| 精品处破学生在线二十三| 欧美精品电影| 欧美一区二区在线播放| 国产婷婷视频在线| 欧美一区二区三区四区在线观看 | 最近中文字幕免费mv| 肉肉av福利一精品导航| 农村寡妇一区二区三区| 国产精品亚洲综合色区韩国| 国产免费一区二区三区| 亚洲三级电影在线观看| 精品视频导航| 久久成人久久鬼色| 国产精品久久久久9999爆乳| 99久精品国产| 美女xx视频| 午夜精品福利一区二区蜜股av| 在线观看你懂| 欧美久久久久久久久中文字幕| caoporm免费视频在线| 精品国产sm最大网站免费看| 91亚洲视频| 欧美成人中文字幕在线| 欧美五码在线| 91精品国产综合久久香蕉| 黄色另类av| 尤物一区二区三区| 久久婷婷久久一区二区三区| www日韩欧美| 日韩欧美精品一区二区三区| 精品国偷自产在线| 一个人看的免费视频色| 欧美激情按摩在线| 国产精品草莓在线免费观看| 日日夜夜亚洲精品| 91产国在线观看动作片喷水| 99热国内精品| 欧美一区三区二区在线观看| 成人午夜av电影| 色婷婷成人在线| 日韩欧美亚洲范冰冰与中字| 91破解版在线观看| 欧美精品xxx| 99视频精品全部免费在线视频| 欧美一区二区福利| 成人丝袜18视频在线观看| 天堂网在线免费观看| 欧美日韩在线免费观看| japanese色国产在线看视频| 久久91精品国产| 影音先锋日韩在线| 天天做天天躁天天躁| 亚洲精品国产成人久久av盗摄| 久草视频在线看| 色悠悠久久88| 小处雏高清一区二区三区| 日韩理论片在线观看| 国产精品全国免费观看高清| 91九色在线porn| 麻豆国产精品va在线观看不卡| 色男人天堂综合再现| 亚洲在线色站| 亚洲一区二区三区国产| 日本不卡1234视频| 国产精品亚洲综合天堂夜夜| 豆国产96在线|亚洲| 日本亚洲一区| 欧美成人免费va影院高清| 一区精品久久| 国产视频精品在线| 亚洲黄色免费av| 国产精品自产拍高潮在线观看| 国内精品在线播放| 青青久在线视频| 日韩中文在线观看| 国产精品综合| 日日噜噜噜夜夜爽爽狠狠| 一级做a爰片久久毛片美女图片| 午夜久久久久| 成人免费在线观看视频网站| 日韩一区二区精品在线观看| 成久久久网站| 男女曰b免费视频| 欧美一级艳片视频免费观看| 欧美日韩在线播放视频| 隔壁人妻偷人bd中字| 欧美亚洲综合色| 伊人久久大香线蕉无限次| 伊人再见免费在线观看高清版| 91国偷自产一区二区三区观看| 亚洲天堂av资源在线观看| 午夜一区二区三区| 色婷婷综合久色| 日韩动漫一区| 91原色影院| 一区二区三区资源| 国产欧美一区二区三区精品酒店| 国产女同一区二区| 久久久久久一二三区| 女人高潮被爽到呻吟在线观看| 成人在线精品视频| 亚洲欧美成人一区二区三区| 欧一区二区三区| 国产成人永久免费视频| 欧美精品日日鲁夜夜添| 91精品在线观看国产| av成人网在线| 韩日欧美一区二区| 国产精品成人网| 超碰97久久| 免费黄色一级网站| 九九视频这里只有精品| 91丝袜国产在线播放| 成人做爰免费视频免费看| 亚洲色婷婷久久精品av蜜桃| 亚洲欧美日韩一区二区在线| 国产精品18久久久久久vr| 一区二区三区欧美日| 国产精品久久久久国产a级| 99国产精品| 国产美女极品在线| 国产精品久久久久久久久久免费 | 在线亚洲国产精品网站| 区一区二日本| 国产精品v欧美精品v日韩| 在线观看日韩国产| 国产成人在线看| 欧美大胆视频| 国产精品免费播放| 人妻内射一区二区在线视频 | 精品在线播放免费| 欧美少妇激情| 国产高清免费在线播放| 国产精品久久精品国产 | 日韩在线播放av| 欧美限制电影| 91破解版在线看| 法国空姐在线观看免费| 日本黄大片在线观看| 免费理论片在线观看播放老| 日日夜夜精品一区| 久久精品日韩精品| 日韩精品一区二区三区四区视频| 奇米色一区二区| 黄色在线免费观看网站| 高清无码一区二区在线观看吞精| 色偷偷亚洲男人天堂| 久久久高清一区二区三区| 任你躁在线精品免费| 国产成人拍精品视频午夜网站| 欧美午夜理伦三级在线观看| 欧美国产成人在线| 奇米综合一区二区三区精品视频| 2020国产精品小视频| a√在线中文网新版址在线| 天天干天天操天天做| 男女裸体影院高潮| 91看片就是不一样| 97超碰青青草| 在线免费观看一区二区三区| 日韩免费av一区二区| 中文字幕久久久| 日韩av高清不卡| 亚洲男人的天堂网站| 亚洲精品1区2区| 男女视频在线| 亚洲成人在线视频网站| 最近2019年好看中文字幕视频 | www.avtt| 青青草一区二区| 9191久久久久久久久久久| 懂色av中文一区二区三区| 亚州综合一区| 超碰个人在线| 熟女人妇 成熟妇女系列视频| 国产精品视频一| 欧美va亚洲va在线观看蝴蝶网| 久久久精品免费免费| 亚洲国内自拍| 狂野欧美xxxx韩国少妇| 欧美一区二区三区少妇|