摘要:思路這是一個可以用回朔法解決的典型題。由于回朔法的遞歸特性,路徑可以被開成一個棧。機器人的運動范圍地上有一個行和列的方格。當它準備進入坐標為的格子時,通過檢查坐標的數位和來判斷機器人是否能夠進入。
矩陣中的路徑
請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 例如 a b c e s f c s a d e e 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因為字符串的第一個字符b占據了矩陣中的第一行第二個格子之后,路徑不能再次進入該格子。
思路:
這是一個可以用回朔法解決的典型題。
1.首先,在矩陣中任選一個格子作為路徑的起點。如果路徑上的第i個字符不是ch,那么這個格子不可能處在路徑上的第i個位置。如果路徑上的第i個字符正好是ch,那么往相鄰的格子尋找路徑上的第i+1個字符。除在矩陣邊界上的格子之外,其他格子都有4個相鄰的格子。重復這個過程直到路徑上的所有字符都在矩陣中找到相應的位置。
2.由于回朔法的遞歸特性,路徑可以被開成一個棧。當在矩陣中定位了路徑中前n個字符的位置之后,在與第n個字符對應的格子的周圍都沒有找到第n+1個字符,這個時候只要在路徑上回到第n-1個字符,重新定位第n個字符。
3.由于路徑不能重復進入矩陣的格子,還需要定義和字符矩陣大小一樣的布爾值矩陣,用來標識路徑是否已經進入每個格子。 當矩陣中坐標為(row,col)的格子和路徑字符串中相應的字符一樣時,從4個相鄰的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路徑字符串中下一個字符
4.如果4個相鄰的格子都沒有匹配字符串中下一個的字符,表明當前路徑字符串中字符在矩陣中的定位不正確,我們需要回到前一個,然后重新定位。
5.一直重復這個過程,直到路徑字符串上所有字符都在矩陣中找到合適的位置。
function hasPath(matrix, rows, cols, str) { let visited = []; for (let i = 0; i < rows * cols; i++) { visited[i] = false; } let pathLen = 0; for (let i = 0; i < rows; i++) {???? for (let j = 0; j < cols; j++) {?????? if (hasPathCore(matrix,rows,cols,i,j,str,pathLen,visited)) {???????? return true;???????? }?????? }?? } return false; } function hasPathCore(matrix,rows,cols,i,j,str,pathLen,visited) { if(str.length === pathLen) { return true; } let hasPath = false; if(i>=0 && i=0 && j 機器人的運動范圍地上有一個m行和n列的方格。一個機器人從坐標0,0的格子開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行坐標和列坐標的數位之和大于k的格子。 例如,當k為18時,機器人能夠進入方格(35,37),因為3+5+3+7 = 18。但是,它不能進入方格(35,38),因為3+5+3+8 = 19。請問該機器人能夠達到多少個格子?
思路:
和前面的題目類似,這個方格也可以看出一個m*n的矩陣。同樣在這個矩陣中,除邊界上的格子之外其他格子都有四個相鄰的格子。
機器人從坐標(0,0)開始移動。當它準備進入坐標為(i,j)的格子時,通過檢查坐標的數位和來判斷機器人是否能夠進入。如果機器人能夠進入坐標為(i,j)的格子,我們接著再判斷它能否進入四個相鄰的格子(i,j-1)、(i-1,j),(i,j+1)和(i+1,j)。
function movingCount(threshold, rows, cols) { let visited = []; for(let i = 0; i < rows * cols; i++) { visited[i] = false; } let count = movingCountCore(threshold,rows,cols,0,0,visited); return count; } function movingCountCore(threshold,rows,cols,i,j,visited) { let count = 0; if(check(threshold,rows,cols,i,j,visited)) { visited[i*cols+j] = true; count = 1 + movingCountCore(threshold,rows,cols,i,j-1,visited) + movingCountCore(threshold,rows,cols,i,j+1,visited) + movingCountCore(threshold,rows,cols,i-1,j,visited) + movingCountCore(threshold,rows,cols,i+1,j,visited); } return count; } //check函數用來判斷機器人能否進入坐標為(i,j)的方格 function check(threshold,rows,cols,i,j,visited) { if(i>=0 && i=0 && j 0) { sum += number%10; number = Math.floor(number/10); } return sum; } console.log(movingCount(18,5,5));
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107503.html
摘要:什么是回溯算法回溯法是一種系統搜索問題解空間的方法。解空間定義為與數字長度相同。最后,為什么要掌握回溯法因為懂了回溯法之后筆試里的很多題就算不了,起碼成功運行到之間是沒問題的。 什么是回溯算法?回溯法是一種系統搜索問題解空間的方法。為了實現回溯,需要給問題定義一個解空間。說到底它是一種搜索算法。只是這里的搜索是在一個叫做解空間的地方搜索。而往往所謂的dfs,bfs都是在圖或者樹這種數據...
摘要:本文總結了前端老司機經常問題的一些問題并結合個人總結給出了比較詳盡的答案。網易阿里騰訊校招社招必備知識點。此外還有網絡線程,定時器任務線程,文件系統處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結了前端老司機經常問題的一些問題并結合個...
閱讀 3571·2021-10-15 09:43
閱讀 3491·2021-09-02 15:21
閱讀 2201·2021-08-11 11:23
閱讀 3242·2019-08-30 15:54
閱讀 1929·2019-08-30 13:54
閱讀 3204·2019-08-29 18:35
閱讀 675·2019-08-29 16:58
閱讀 1746·2019-08-29 12:49