自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

回溯算法-機器人的運動范圍

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

[[415476]]

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

前言

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

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

實現(xiàn)思路

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

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

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

判斷當前格子是否已訪問

首先,我們需要創(chuàng)建一個與原矩陣大小相同的矩陣,用于標識機器人是否已走這個格子。

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

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

判斷格子是否可進入

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

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

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

開始移動機器人

移動機器人時,我們需要7個參數(shù):

  • 矩陣的總行數(shù)
  • 矩陣的總列數(shù)
  • 即將進入格子的行坐標
  • 即將進入格子的列坐標
  • 最大活動范圍
  • 訪問標識矩陣
  • 路徑矩陣

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

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

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

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

實現(xiàn)代碼

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

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

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

  1.   /** 
  2.    * 判斷機器人能否進入目標格子 
  3.    * @param row 行坐標 
  4.    * @param col 列坐標 
  5.    * @param target 臨界點 
  6.    * @private 
  7.    */ 
  8.   private checkPath(row: number, col: number, target: number): boolean { 
  9.     // 兩坐標的數(shù)位之和必須小于等于臨界點 
  10.     return sumOfDigits(row) + sumOfDigits(col) <= target; 
  11.   } 
  12.  
  13. // 轉(zhuǎn)字符串實現(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ù)位之和 - 模運算實現(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; 

移動機器人函數(shù)

移動機器人至指定格子實現(xiàn)代碼如下所示:

  1. /** 
  2.  * 開始移動機器人 
  3.  * @param rows 矩陣總行數(shù) 
  4.  * @param cols 矩陣總列數(shù) 
  5.  * @param row 待進入格子的行坐標 
  6.  * @param col 待進入格子的列坐標 
  7.  * @param threshold 最大活動范圍 
  8.  * @param isVisited 訪問標識矩陣 
  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.   // 記錄當前訪問的格子內(nèi)容 
  33.   this.path += `${matrix[row][col]} -> `; 
  34.   // 標識當前格子已被訪問 
  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ù)的實現(xiàn),如下所示:

  1. /** 
  2.  * 題目: 
  3.  * 地上有一個m行n列的方格。 
  4.  * 一個機器人從坐標(0,0)的格子開始移動, 
  5.  * 它每次可以向左、右、上、下移動一格,但不能進入行坐標和列坐標的數(shù)位之和大于k的格子。 
  6.  * 例如,當k為18時,機器人能夠進入方格 (35,37),因為3+5+3+7=18。 
  7.  * 但它不能進入方格(35,38),因為3+5+3+8=19. 請問該機器人能夠到達多少個格子? 
  8.  * @param matrix 矩陣 
  9.  * @param threshold 臨界點(最大活動范圍) 
  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)建標記數(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位置開始移動,計算總的移動格子數(shù)量 
  24.   return this.startMoving(rows, cols, 0, 0, threshold, isVisited, matrix); 

完整代碼請移步:Backtracking.ts#L80

編寫測試用例

接下來,我們構造一個矩陣來驗證下上述代碼能否正確執(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.   "機器人總共可走的格子總數(shù)為: "
  12.   totalCount, 
  13.   ",運動軌跡為: "
  14.   path.substr(0, path.length - 3) 
  15. ); 

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

 

責任編輯:武曉燕 來源: 神奇的程序員K
相關推薦

2021-10-20 10:48:30

機器人人工智能算法

2019-06-26 23:27:33

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

2020-10-15 15:42:00

人工智能

2015-12-10 21:49:32

IM機器人

2020-09-24 10:49:50

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

2021-07-22 10:17:55

加密機器人加密貨幣機器人

2021-08-19 15:44:20

機器人人工智能機器學習

2015-07-28 09:36:11

機器人

2017-03-28 12:21:21

機器人定義

2022-07-28 11:26:41

人工智能機器人

2012-03-08 09:42:16

開源軟件Linux

2020-04-09 09:56:55

機器人導航框架

2021-04-08 09:33:02

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

2021-03-25 09:25:55

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

2021-07-19 09:11:05

機器人人工智能算法

2018-07-05 17:01:42

人工智能機器學習機器人

2019-11-06 11:40:19

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

2022-10-21 17:30:26

機器人
點贊
收藏

51CTO技術棧公眾號