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

2021-10-10 19:22:32 字數 1318 閱讀 1987

題目:輸入矩陣的行數m和列數n,要求m和n每位數字之和不能大於k,問機械人最多能到達幾個元素。

public int movingcount(int m, int n, int k)

思路:dfs+剪枝。模擬 矩陣中的路徑 來做。

從(0,0)開始搜尋,只能i+1(往下),j+1(往右)。那(0,0)就是在左上角。因為只從(0,0)乙個點開始搜尋,所以被訪問過的點就不用回溯到未訪問的狀態(像矩陣中的路徑中要從多個點開始搜尋,那就需要回溯,否則就會影響別的點)。

由於不需要回退,則i+1(往下),j+1(往右)就以足夠,所以dfs只需要寫兩個。

剪枝(限制和判斷條件):1.不能越界 2.m和n的每位之和不能大於k 3.訪問過的不再繼續計數(用visited[i][j])

注意:1.不用回退

2.return的時候要加1,因為到這裡i,j這個元素已經滿足條件。

3.(0,0)為左上角(因為從(0,0)開始只能i+1(向下),j+1(向右)),又不用回退,所以只需要兩個方向。

4.每位之和可以寫成乙個小函式public int eachdigitsum(int x)。

public

intmovingcount

(int m,

int n,

int k)

boolean

visited =

newboolean

[m][n]

;return

dfs(0,

0,visited,k);}

private

intdfs

(int i,

int j,

boolean

visited,

int k)

visited[i]

[j]=

true

;//可以寫成兩個(i+1為向下,j+1為向右),因為起點(0,0)在左上角,又不用回退,所以已經足夠

return1+

dfs(i+

1,j,visited,k)

+dfs

(i,j+

1,visited,k)

+dfs

(i-1

,j,visited,k)

+dfs

(i,j-

1,visited,k);}

private

inteachdigitsum

(int x)

return sum;

}

劍指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。但它不能進入...