日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围

發(fā)布時(shí)間:2024/9/30 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、矩陣中的路徑

1、題目描述:

請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù),用來(lái)判斷在一個(gè)矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一個(gè)格子開(kāi)始,每一步可以在矩陣中向左,向右,向上,向下移動(dòng)一個(gè)格子。如果一條路徑經(jīng)過(guò)了矩陣中的某一個(gè)格子,則之后不能再次進(jìn)入這個(gè)格子。 例如 a b c e s f c s a d e e 這樣的3 X 4 矩陣中包含一條字符串"bcced"的路徑,但是矩陣中不包含"abcb"路徑,因?yàn)樽址牡谝粋€(gè)字符b占據(jù)了矩陣中的第一行第二個(gè)格子之后,路徑不能再次進(jìn)入該格子。

2、解決思路:使用“回溯算法”

參考牛客網(wǎng)的“張佃鵬”、“l(fā)izo”:https://www.nowcoder.com/questionTerminal/c61c6999eecb4b8f88a98f66b273a3cc

?(1)這是一個(gè)可以用回朔法解決的典型題。首先,在矩陣中任選一個(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)的格子的周圍都沒(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ò)程,直到路徑字符串上所有字符都在矩陣中找到合適的位置.

3、代碼實(shí)現(xiàn):

public class Test28 {public boolean hasPath(char[] matrix, int rows, int cols, char[] str){int[] flag = new int[matrix.length];for(int i = 0;i<rows;i++){for(int j=0;j<cols;j++){if(helper(matrix,rows,cols,i,j,str,0,flag)){return true;}}}return false;}private boolean helper(char[] matrix,int rows,int cols,int i,int j,char[] str,int k,int[] flag){int index = i*cols+j;if(i<0 || i>=rows || j<0 || j>=cols || matrix[index]!=str[k] || flag[index]==1 ){return false;}if(k == str.length-1) return true;flag[index] = 1;if(helper(matrix, rows, cols, i - 1, j, str, k + 1, flag)|| helper(matrix, rows, cols, i + 1, j, str, k + 1, flag)|| helper(matrix, rows, cols, i, j - 1, str, k + 1, flag)|| helper(matrix, rows, cols, i, j + 1, str, k + 1, flag)){return true;}flag[index] = 0;return false;} }

?

?

二、機(jī)器人的運(yùn)動(dòng)范圍:

1、題目描述:

地上有一個(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è)格子?

2、解題思路:

參考牛客網(wǎng)的“l(fā)izo”:https://www.nowcoder.com/questionTerminal/6e5207314b5241fb83f2329e89fdecc8

思路也基本跟上一題的思路一樣。

3、代碼實(shí)現(xiàn):

public class Test29 {public int movingCount(int threshold, int rows, int cols){int flag[][] = new int[rows][cols];//記錄是否已經(jīng)走過(guò)return helper(0,0,rows,cols,flag,threshold);}private int helper(int i, int j, int rows, int cols, int[][] flag, int threshold) {if(i<0 || i>=rows || j<0 || j>=cols || numSum(i)+numSum(j)>threshold || flag[i][j] ==1){return 0;}flag[i][j] =1;return helper(i-1,j,rows,cols,flag,threshold)+helper(i+1,j,rows,cols,flag,threshold)+helper(i,j-1,rows,cols,flag,threshold)+helper(i,j+1,rows,cols,flag,threshold)+1;}private int numSum(int i){int sum = 0;do{sum+= i%10;}while((i=i/10)>0);return sum;} }

?

總結(jié)

以上是生活随笔為你收集整理的《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。