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時,機械人...