地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。 例如,當k為18時,機械人能夠進入方格(35,37),因為3+5+3+7=18。但是,它不能進入方格(35,38),因為3+5+3+8=19。請問該機械人能夠達到多少個格仔?
使用回溯法。
1)遍歷這個矩陣,從座標(0,0)開始移動;
2)遍歷該位置的上下左右四個位置,如果行列座標數字和小於等於k,那麼該位置為下一次遍歷的起點,如果大於,就需要回退到上乙個位置,然後重新遍歷;
3)需要建立乙個輔助陣列用來標記該位置是否經過。
public
class
solution
private
intmovingcountcore
(int threshold,
int rows,
int cols,
int row,
int col,
boolean
visited)
int i = row * cols + col;
// 如果已經經過或者座標和大於要求的k值則返回0
if(visited[i]||!
checksum
(threshold, row, col)
) visited[i]
=true
;// 往當前位置上下左右四個方向移動
return1+
movingcountcore
(threshold, rows, cols, row, col +
1, visited)
+movingcountcore
(threshold, rows, cols, row, col -
1, visited)
+movingcountcore
(threshold, rows, cols, row +
1, col, visited)
+movingcountcore
(threshold, rows, cols, row -
1, col, visited);}
// 判斷當前位置座標和是否小於等於要求的k值
private
boolean
checksum
(int threshold,
int row,
int col)
while
(col !=0)
return sum <= threshold;
}}
劍指offer 66 機械人的運動範圍
地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...
劍指offer 66 機械人的運動範圍
1.題目描述地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 ...
劍指offer 66 機械人的運動範圍
題目描述 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8...