JZ13 機械人的運動範圍

2022-09-19 19:30:16 字數 2206 閱讀 4064

地上有乙個 rows 行和 cols 列的方格。座標從 [0,0] 到 [rows-1,cols-1] 。乙個機械人從座標 [0,0] 的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於 threshold 的格仔。 例如,當 threshold 為 18 時,機械人能夠進入方格 [35,37] ,因為 3+5+3+7 = 18。但是,它不能進入方格 [35,38] ,因為 3+5+3+8 = 19 。請問該機械人能夠達到多少個格仔?

資料範圍:0 ≤ threshold ≤ 15,1 ≤ rows,cols ≤ 100

高階:空間複雜度 o(nm),時間複雜度 o(nm)

示例1

輸入:

1,2,3
返回值:

3
複製

示例2

輸入:

0,1,3
返回值:

1
示例3

輸入:

10,1,100
返回值:

29
說明:

[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 這29種,後面的[0,29],[0,30]以及[0,31]等等是無法到達的
本題與 jz12 類似,都是在矩陣中尋找能到達的位置,因此思路是一樣的:從某乙個格仔開始,前往它周圍的四個格仔,到達新的格仔後判斷當前位置是否符合要求,不符合則直接返回,符合則繼續前往周圍的格仔。程式的實現方式為遞迴。

但本題與 jz12 的尋找一條路徑不同,本題的要求是尋找所有能到達的格仔。

在 jz12 中,遞迴的停止條件是路徑字串為空,說明走到頭了;但在本題中,遞迴不需要特定的停止條件,因為題目的要求,需要前往任何可能到達的位置,而某個位置是否要進行遞迴由它是否符合規則和是否訪問過決定的。若進入某一位置後,它不符合規則或已訪問過,就會直接返回,因此這個位置不會產生遞迴棧,也不會被計入可到達的位置。

總而言之,本題的關鍵點為:

因為規則和訪問標記陣列 visited 的限制,「機械人」是不會前往不符合規則的格仔和走回頭路的,這使得程式在有限地遍歷而不是無限地遞迴。

與求樹的深度問題類似,當前格仔能到達的格仔數,是它周圍四個格仔所能到達格仔的總和加一。

**清單

public class solution 

public int movingcountcore(int threshold,int rows,int cols,

int row,int col,boolean visited)else

}// 判斷能否進入某個格仔

public boolean canmove(int threshold,int rows,int cols,

int row,int col,boolean visited)

// 獲取乙個數字的數字和

public int getdigitalsum(int num)

return sum;

}}

雖然有四個方法,但其實總**量很少且方法各司其職,思路清晰:

movingcount:入口方法,從起點開始獲取總共能到達的格仔數;

movingcountcore:核心方法,計算某格仔能到達的格仔數,即為它周圍四個格仔能到達格仔數加一;

canmove:判斷方法,根據規則和訪問標記陣列 visited 判斷某格仔是否能進入;

getdigitalsum:工具方法,計算數字和,為判斷方法服務。

本題與 jz12 類似,都是處理乙個矩陣中尋找路線的問題。對這種問題,將矩陣看做陣列,尋找路線使用遞迴方式和回溯法,可以產生比較好的思路。不過我太久沒用遞迴,總是忘記考慮遞迴的停止條件。

13 機械人運動範圍

地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...

回溯 JZ 機械人的運動範圍

地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...

13 機械人的運動範圍

有乙個m行n列的方格,乙個機械人從座標 0 0 的格仔開始移動,它每次可以向上下左右移動一格,但不能進入座標位數和大於threshold的格仔,求機械人一共能到達多少個格仔 機械人從 0,0 開始移動,當要移動到 i,j 時,先判斷i,j是否滿足條件,如果滿足,就進入,遞迴執行。如果不滿足,嘗試其他...