機械人的運動範圍

2021-10-12 01:22:55 字數 1576 閱讀 8560

**

題目出處:

題目思路:

將其變為乙個n行m列的二維陣列,並將符合要求的答案全部標記為true,最後能擴散開來的t最大面積即為答案

那如何進行計數呢? 用dfs演算法。

用乙個佇列儲存各點的座標,如果該點的四周存在t,則將該點放入佇列,並將已經放入佇列的點變為f,最後放入幾個點答案就是幾,最後隊列為空時則結束計數。

為了不考慮邊界問題,我們在構建陣列的時候在周圍加上一圈f

例如k = 2 n = 4 m = 5

列 0 1 2 3 4

行0 t t t f f

1 t t f f f

2 t f f f f

3 f f f f f

為了不考慮邊界問題,在外界加一層f

列 0 1 2 3 4 5 6

行 0 f f f f f f f

1 f t t t f f f

2 f t t f f f f

3 f t f f f f f

4 f f f f f f f

5 f f f f f f f

第一步: 往佇列加入<1,1> <1,1>變為f 計數 0

第二步:將<1,1>周圍的<1,2><2,1>加入佇列變為f 彈出<1,1> 計數 1

第三步:將<1,2>周圍的<1,3><2,2>加入佇列變為f彈出<1,2>計數2

第四步:將<2,1>周圍的<3,1>加入佇列變為f彈出<2,1>計數3

第五步:將<1,3>彈出計數4

第六步:將<2,2>彈出計數5

第七步:將<3,1>彈出計數6 ; 隊列為空,停止計數。

ac**如下:

class

solution

,dy[4]

=;if(rows==

0&&cols==0)

return0;

queue

int,

int>

>q;

vector

bool

>

>

ver(rows+2,

vector

<

bool

>

(cols+2)

);for(

int i =

1;i<=rows;i++

)for

(int j =

1;j<=cols;j++)if

((i-1)

/10+(i-1)

%10+(j-1)

/10+(j-1)

%10<=threshold)ver[i]

[j]=

true

; q.

push()

; ver[1]

[1]=

false

;while

(!q.

empty()

));}

}}return res;}}

;

機械人運動範圍

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