地上有乙個m行和n列的方格。乙個機械人從座標(0,0)的格仔開始移動,每一次只能向左,右,上,下四個方向中其中乙個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。 例如,當k為18時,機械人能夠進入方格(35,37),因為3+5+3+7 = 18。但是,它不能進入方格(35,38),因為3+5+3+8 = 19。請問該機械人能夠達到多少個格仔?
輸入示例:
m=5, n=5, k=6
輸出示例:
22
需要注意是橫縱座標的數字之和,不是直接求和。
本題採用「回溯法」進行求解,關於回溯法的介紹和應用可以翻閱此處。
需要注意的除了數字和的限制外,還要注意題目所求是「機械人能夠達到多少個格仔」,仔細分析是要求這個機械人最多可以到達多少個格仔,而非最深路徑能夠到達多少個格仔。
class
solution
while
(col!=0)
if(i+j<=threshold)
else
}void
backtracking
(vector
int>>
&used,
int i,
int j,
int threshold,
int rows,
int cols,
int&cnt)if(
shuweihe
(i,j,threshold))if
(i+1
[j]!=1)
if(j-
1>=
0&& used[i]
[j-1]!=
1)if(i-
1>=
0&& used[i-1]
[j]!=1)
// used[i][j]=0;//無需重置,走過的已經被計數了,不再走
return;}
else
}int
movingcount
(int threshold,
int rows,
int cols)
int cnt=0;
backtracking
(used,0,
0, threshold, rows, cols, cnt)
;return cnt;}}
;
#include
#include
using
namespace std;
//code block,上述**塊,填充至此。
intmain()
輸入:
5, 5, 6
輸出:22
輸入:5,10,10
輸出:21
輸入:15,20,20
輸出:359
本題是要求這個機械人最多可以到達多少個格仔。那如果進一步考慮,要求最深路徑能夠到達多少個格仔呢?應該怎麼求解?
可以想到,需要在上述函式中新增最大值max記錄,記錄每次機械人走完一條路徑後到達格仔數的最大值。但是可以想到的是,如果這個二維矩陣過大且給的閾值過大,那麼機械人可以走的路徑是非常多的,在一定時間內幾乎無法遍歷完,因此下述**只是對此問題給個初步解答,實際上只能求解矩陣較小或者閾值較小的情況。
class
solution
while
(col!=0)
if(i+j<=threshold)
else
}int
backtracking
(vector
int>>
&used,
int i,
int j,
int threshold,
int rows,
int cols,
int&cnt,
int&max)if(
shuweihe
(i,j,threshold))if
(i+1
[j]!=1)
if(j-
1>=
0&& used[i]
[j-1]!=
1)if(i-
1>=
0&& used[i-1]
[j]!=1)
used[i]
[j]=0;
//重置
if(cnt>max)
cnt--
;return max;
}else
return max;
//時刻保證return的是最大值}}
intmovingcount
(int threshold,
int rows,
int cols)
int cnt=
0, max =0;
max =
backtracking
(used,0,
0, threshold, rows, cols, cnt, max)
;return max;}}
;
對此問題的測試用例:
輸入:5, 5, 6
輸出:21
注意兩個問題的區別:在5,5,6的輸入下,這個機械人最多可以到達22個格仔,單次最深路徑能夠到達21個格仔。
按照**中規定的「右下左上」的試探順序,可以畫圖如下:
機械人運動範圍
題目 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 1...
機械人運動範圍
地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8 19。請...
演算法題 機械人的運動範圍
題目描述 地上有乙個m行和n列的方格。乙個機械人從座標0,0的格仔開始移動,每一次只能向左,右,上,下四個方向移動一格,但是不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但是,它不能進入方格 35,38 因為3 5 3 8...