程式設計題 機械人的運動範圍

2021-10-05 11:04:14 字數 2879 閱讀 7851

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