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