題目:輸入矩陣的行數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。但它不能進入...