劍指Offer學習 題66 機械人的運動範圍

2021-09-23 22:06:38 字數 1526 閱讀 7279

題目:

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

思路:

回溯法:

從(0,0)開始走,每成功走一步,就標記當前的位置為true,然後從上、下、左、右四個方向探索,直到訪問完矩陣中所有的格仔為止;

1、要求矩陣的格仔不能重複進入,還需要定義乙個跟字元矩陣同樣大小的布林矩陣,用來標識路徑是否已經進入過該格仔;

2、當矩陣中座標為(row,col)的格仔滿足條件時,對4個相鄰的格仔(row,col-1),(row-1,col),(row,col+1)以及(row+1,col)進行下一步的判斷

判斷的條件:

(1)當前格仔在矩陣內;

(2)當前格仔對應座標的位數和在閾值範圍內;

(3)當前格仔沒有被訪問過。

程式:

public

class

subject66

boolean[

] visited =

newboolean

[rows]

[cols]

;return

moving

(threshold,

0, rows,

0, cols, visited);}

public

static int moving

(int threshold, int row, int rows, int col, int cols, boolean[

] visited)

visited[row]

[col]

=true

;//標記當前格仔被走過

return

moving

(threshold, row -

1, rows, col, cols, visited)

//上、下、左、右

+moving

(threshold, row +

1, rows, col, cols, visited)

+moving

(threshold, row , rows, col -

1, cols, visited)

+moving

(threshold, row , rows, col +

1, cols, visited)+1

;}public

static int sum

(int num)

return result;

}public

static

void

main

(string args)

}

66 機械人的運動範圍 劍指offer

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

66 劍指offer 機械人的運動範圍

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

劍指offer系列(66)機械人的運動範圍

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