Leetcode 機械人的運動範圍

2021-10-03 21:21:05 字數 1915 閱讀 4809

leetcode

地上有乙個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。請問該機械人能夠到達多少個格仔?

這是乙個矩陣搜尋問題

數字和對於題目中的求和是數字和,對每一位的值拆開再求

x % 10 取餘,得到最後一位的值

x // 10 去掉最後一位,進一位

數字x 的數字和為sum(x)

如果(x+)%10 == 0, sum(x+1) = sum(x) -8

其他情況下, sum(x+1) = sum(x)+1

dfs 深度優先搜尋

dfs 通過遞迴,先朝乙個方向搜到底,再回溯至上個節點,沿另乙個方向搜尋,以此類推。

遞迴終止條件:該點已經搜尋過,或者該點數字和超過限制或者該點行列索引值超出界限

遞迴方式:向右和向下移動

class

solution

:def

movingcount

(self, m:

int, n:

int, k:

int)

->

int:

if k==0:

return

1 visited =

set(

)def

dfs(i,j,s1,s2)

:if i>m-

1or j > n-

1or s1+s2>k or

(i,j)

in visited:

return

0 visited.add(

(i,j)

)return

1+dfs(i+

1,j,s1+1if

(i+1)%

10else s1-

8,s2)

+dfs(i,j+

1,s1,s2+1if

(j+1)%

10else s2-8)

return dfs(0,

0,0,

0)

bfs 廣度優先搜尋

bfs 通過佇列實現,

如果隊列為空,表示所有解搜尋完畢

class

solution

:def

movingcount

(self, m:

int, n:

int, k:

int)

->

int:

if k==0:

return

1 queue = collections.deque()(

0,0,

0,0)

) visited =

set(

)while queue:

i,j,s1,s2 = queue.popleft(

)if i> m-

1or j> n-

1or s1+s2 > k or

(i,j)

in visited:

continue

visited.add(

(i,j)

)(i+

1,j,s1+1if

(i+1)%

10else s1-

8,s2)

)(i,j+

1,s1,s2+1if

(j+1)%

10else s2-8)

)return

len(visited)

leetcode面試題13 機械人的運動範圍

地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不能進入...

leetcode面試題13 機械人的運動範圍

題目 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人能夠進入方格 35,37 因為3 5 3 7 18。但它不...

LeetCode 機械人的運動範圍

部落格說明 介紹劍指 offer 13.機械人的運動範圍 題目 地上有乙個m行n列的方格,從座標 0,0 到座標 m 1,n 1 乙個機械人從座標 0,0 的格仔開始移動,它每次可以向左 右 上 下移動一格 不能移動到方格外 也不能進入行座標和列座標的數字之和大於k的格仔。例如,當k為18時,機械人...