機械人的運動範圍 bfs dfs

2021-10-23 07:16:41 字數 1355 閱讀 7354

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