劍指 13 機械人的運動範圍 難度中等

2021-10-22 20:32:24 字數 1382 閱讀 7631

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

示例 1:

輸入:m = 2, n = 3, k = 1

輸出:3

示例 2:

輸入:m = 3, n = 1, k = 0

輸出:1

1 <= n,m <= 100

0 <= k <= 20

思路:根據下標數字之和所呈現的規律,深度優先搜尋實際只需要向下和向右展開即可,這個細節可以讓**的時間效率提高,算是一種優化。對於當前格仔是否可達,首先判斷當前位置下標是否越界,然後判斷當前格仔是否已經到達過以及下標數字之和是否滿足條件。(下面的**有一些細節之處需要好好看一下。)

/**

* @param m

* @param n

* @param k

* @return

*/var movingcount =

function

(m, n, k)

//判斷是否走過當前格仔以及數字之和是否大於k

if(flagarr[i]

[j]||

!judge

(i, j, k)

)//做出選擇

flagarr[i]

[j]=

true

;//進入下一步搜尋

return1+

movingcountcore

(m, n, k, i+

1, j, flagarr)

+movingcountcore

(m, n, k, i, j+

1, flagarr);}

//判斷當前下標數字之和是否大於k

function judge

(i, j, k)

return sum <= k;

}//建立二維陣列,標記是否走過該格仔

//true-走過;false-沒走過

function createarray

(rows, cols)

}return result;}}

;

時間複雜度:o(mn);

空間複雜度:o(mn);

收穫:js建立二維陣列;

參考:

劍指offer13機械人的運動範圍

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

劍指Offer系列13 機械人的運動範圍

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

劍指 Offer 13 機械人的運動範圍

題目描述 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但...