劍指Offer(66) 機械人的運動範圍

2021-09-18 05:53:24 字數 1321 閱讀 6536

地上有乙個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...