地上有乙個m行n列的方格,從座標 [0,0] 到座標 [m-1,n-1] 。乙個機械人從座標 [0, 0] 的格仔開始移動,它每次可以向左、右、上、下移動一格(不能移動到方格外),也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 [35, 37] ,因為3+5+3+7=18。但它不能進入方格 [35, 38],因為3+5+3+8=19。請問該機械人能夠到達多少個格仔?
思路: 這個問題其實用bfs和dfs都很好做,和矩陣迷宮的做法其實是一樣的,位數相加不能超過k其實就是矩陣中的障礙。題目說的可以上下左右四個方向,其實只需要向下和向右即可,而向上和向左其實和下,右是重疊的。
dfs其實就是一直向下遞迴, (i,j)這個位置可以從 dfs(i-1,j)+dfs(i,j-1)+dfs(i+1,j)+dfs(i,j+1)轉移過來,最後 return的是1+dfs(i-1,j,m,n,k)+dfs(i,j-1,m,n,k)+dfs(i+1,j,m,n,k)+dfs(i,j+1,m,n,k),結果是要+1,因為要加上當前i,j的位置。
這裡需要注意的是需要乙個vis陣列記錄矩陣的某個元素是否被訪問過。
class
solution
return ret;
}int
dfs(
int i,
int j,
int m,
int n,
int k)
intmovingcount
(int m,
int n,
int k)
};
思路: bfs就是利用乙個佇列,從矩陣的首元素開始(0,0),取對頭元素,出隊,判斷對頭元素的上下左右是否合法,這裡仍然需要乙個vis陣列記錄某個位置是是否訪問過,最後ans++。為方便記錄和比較,我們在佇列中使用pair(int x ,int y),入對的是座標
class
solution
return sum;
} vectorbool
>> vis;
intmovingcount
(int m,
int n,
int k)
;int dy=
; queueint,
int>> que;
que.
push
(make_pair(0
,0))
; ans++
; vis[0]
[0]=
true
;while
(!que.
empty()
)}return ans;}}
;
機械人運動範圍
題目 地上有乙個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...