**
題目出處:
題目思路:
將其變為乙個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...