最近想將劍指 offer 13 重新刷一遍,因為之間是在leetcode上面做的題目,現在在牛客上面,我發現有些邊界條件牛客沒給出,但是面試基本手撕**都是在牛客上面。
題目:
牛客:劍指 offer 13. 機械人的運動範圍
leetcode:劍指 offer 13. 機械人的運動範圍
思路:
首先我們做這種題目是需要有一些必須寫出的函式。邊界函式isarea() 還有個記錄是否訪問的二維陣列used以及方向增量陣列dxy
bool
isarea
(int rows,
int cols,
int temp_i,
int temp_j)
記錄是否訪問過的二維陣列used
vector
bool
>>
used
(rows,vector<
bool
>
(cols,
false))
;
方向增量陣列
vector
int>> dxy,,,};
現在開始分析題意,題目要求是可到達的位置數目,也就是說明重複走過的格仔不用再走了,顯然是flood fill的意思(used每次訪問設定true,在往回走時不用恢復為false)
這題題目說不能進入行座標和列座標的數字之和大於k的格仔
需要乙個函式getlegal
int
getlegal
(int temp_i,
int temp_j,
int threshold)
while
(temp_j!=0)
return threshold>=sum;
}
方法一:
萬能的dfs ,我們在dfs中注意used設定為true就不用再恢復了
方法二:廣度優先遍歷bfs
我們需要注意佇列中存的是pairnode,相關的值是node.first,node.second.
class
solution,,
,};bool
isarea
(int rows,
int cols,
int temp_i,
int temp_j)
intgetlegal
(int temp_i,
int temp_j,
int threshold)
while
(temp_j!=0)
return threshold>=sum;
}void
dfs(
int rows,
int cols,
int current_i,
int current_j, vector
bool
>>
&used,
int threshold )}}
public
:int
movingcount
(int threshold,
int rows,
int cols)
}return count;}}
;
方法二: 使用佇列進行廣度優先遍歷
class
solution,,
,};bool
isarea
(int rows,
int cols,
int temp_i,
int temp_j)
intgetlegal
(int temp_i,
int temp_j,
int threshold)
while
(temp_j!=0)
return threshold>=sum;
}void
dfs(
int rows,
int cols,
int current_i,
int current_j, vector
bool
>>
&used,
int threshold )}}
public
:int
movingcount
(int threshold,
int rows,
int cols));
int count=0;
while
(!qu.
empty()
)); used[temp_i]
[temp_j]
=true;}
}}}return count;}}
;
劍指offer13機械人的運動範圍
地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不能進入...
劍指 Offer 13 機械人的運動範圍
題目描述 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但...
劍指 Offer 13 機械人的運動範圍
地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不能進入...