摘要:思路這是一個(gè)可以用回朔法解決的典型題。由于回朔法的遞歸特性,路徑可以被開(kāi)成一個(gè)棧。機(jī)器人的運(yùn)動(dòng)范圍地上有一個(gè)行和列的方格。當(dāng)它準(zhǔn)備進(jìn)入坐標(biāo)為的格子時(shí),通過(guò)檢查坐標(biāo)的數(shù)位和來(lái)判斷機(jī)器人是否能夠進(jìn)入。
矩陣中的路徑
請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù),用來(lái)判斷在一個(gè)矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個(gè)格子開(kāi)始,每一步可以在矩陣中向左,向右,向上,向下移動(dòng)一個(gè)格子。如果一條路徑經(jīng)過(guò)了矩陣中的某一個(gè)格子,則該路徑不能再進(jìn)入該格子。 例如 a b c e s f c s a d e e 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因?yàn)樽址牡谝粋€(gè)字符b占據(jù)了矩陣中的第一行第二個(gè)格子之后,路徑不能再次進(jìn)入該格子。
思路:
這是一個(gè)可以用回朔法解決的典型題。
1.首先,在矩陣中任選一個(gè)格子作為路徑的起點(diǎn)。如果路徑上的第i個(gè)字符不是ch,那么這個(gè)格子不可能處在路徑上的第i個(gè)位置。如果路徑上的第i個(gè)字符正好是ch,那么往相鄰的格子尋找路徑上的第i+1個(gè)字符。除在矩陣邊界上的格子之外,其他格子都有4個(gè)相鄰的格子。重復(fù)這個(gè)過(guò)程直到路徑上的所有字符都在矩陣中找到相應(yīng)的位置。
2.由于回朔法的遞歸特性,路徑可以被開(kāi)成一個(gè)棧。當(dāng)在矩陣中定位了路徑中前n個(gè)字符的位置之后,在與第n個(gè)字符對(duì)應(yīng)的格子的周?chē)紱](méi)有找到第n+1個(gè)字符,這個(gè)時(shí)候只要在路徑上回到第n-1個(gè)字符,重新定位第n個(gè)字符。
3.由于路徑不能重復(fù)進(jìn)入矩陣的格子,還需要定義和字符矩陣大小一樣的布爾值矩陣,用來(lái)標(biāo)識(shí)路徑是否已經(jīng)進(jìn)入每個(gè)格子。 當(dāng)矩陣中坐標(biāo)為(row,col)的格子和路徑字符串中相應(yīng)的字符一樣時(shí),從4個(gè)相鄰的格子(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)中去定位路徑字符串中下一個(gè)字符
4.如果4個(gè)相鄰的格子都沒(méi)有匹配字符串中下一個(gè)的字符,表明當(dāng)前路徑字符串中字符在矩陣中的定位不正確,我們需要回到前一個(gè),然后重新定位。
5.一直重復(fù)這個(gè)過(guò)程,直到路徑字符串上所有字符都在矩陣中找到合適的位置。
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 機(jī)器人的運(yùn)動(dòng)范圍地上有一個(gè)m行和n列的方格。一個(gè)機(jī)器人從坐標(biāo)0,0的格子開(kāi)始移動(dòng),每一次只能向左,右,上,下四個(gè)方向移動(dòng)一格,但是不能進(jìn)入行坐標(biāo)和列坐標(biāo)的數(shù)位之和大于k的格子。 例如,當(dāng)k為18時(shí),機(jī)器人能夠進(jìn)入方格(35,37),因?yàn)?+5+3+7 = 18。但是,它不能進(jìn)入方格(35,38),因?yàn)?+5+3+8 = 19。請(qǐng)問(wèn)該機(jī)器人能夠達(dá)到多少個(gè)格子?
思路:
和前面的題目類(lèi)似,這個(gè)方格也可以看出一個(gè)m*n的矩陣。同樣在這個(gè)矩陣中,除邊界上的格子之外其他格子都有四個(gè)相鄰的格子。
機(jī)器人從坐標(biāo)(0,0)開(kāi)始移動(dòng)。當(dāng)它準(zhǔn)備進(jìn)入坐標(biāo)為(i,j)的格子時(shí),通過(guò)檢查坐標(biāo)的數(shù)位和來(lái)判斷機(jī)器人是否能夠進(jìn)入。如果機(jī)器人能夠進(jìn)入坐標(biāo)為(i,j)的格子,我們接著再判斷它能否進(jìn)入四個(gè)相鄰的格子(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函數(shù)用來(lái)判斷機(jī)器人能否進(jìn)入坐標(biāo)為(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));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107503.html
摘要:什么是回溯算法回溯法是一種系統(tǒng)搜索問(wèn)題解空間的方法。解空間定義為與數(shù)字長(zhǎng)度相同。最后,為什么要掌握回溯法因?yàn)槎嘶厮莘ㄖ蠊P試?yán)锏暮芏囝}就算不了,起碼成功運(yùn)行到之間是沒(méi)問(wèn)題的。 什么是回溯算法?回溯法是一種系統(tǒng)搜索問(wèn)題解空間的方法。為了實(shí)現(xiàn)回溯,需要給問(wèn)題定義一個(gè)解空間。說(shuō)到底它是一種搜索算法。只是這里的搜索是在一個(gè)叫做解空間的地方搜索。而往往所謂的dfs,bfs都是在圖或者樹(shù)這種數(shù)據(jù)...
摘要:回溯算法主要思想回溯算法的基本思想是從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來(lái),換一條路再試?;厮菟惴ㄕf(shuō)白了就是窮舉法?;厮菟惴ㄒ步性囂椒?,它是一種系統(tǒng)地搜索問(wèn)題的解的方法。用回溯算法解決問(wèn)題的一般步驟為定義一個(gè)解空間,它包含問(wèn)題的解。 回溯算法 主要思想 回溯算法的基本思想是:從一條路往前走,能進(jìn)則進(jìn),不能進(jìn)則退回來(lái),換一條路再試。八皇后問(wèn)題就是回溯算法的典型,第一步按照順序放一個(gè)皇...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
閱讀 3576·2021-10-15 09:43
閱讀 3496·2021-09-02 15:21
閱讀 2208·2021-08-11 11:23
閱讀 3247·2019-08-30 15:54
閱讀 1938·2019-08-30 13:54
閱讀 3208·2019-08-29 18:35
閱讀 679·2019-08-29 16:58
閱讀 1751·2019-08-29 12:49