-
Notifications
You must be signed in to change notification settings - Fork 8
/
2617.Minimum Number of Visited Cells in a Grid.(BFS).py
49 lines (47 loc) · 1.57 KB
/
2617.Minimum Number of Visited Cells in a Grid.(BFS).py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from collections import deque, defaultdict
class Solution(object):
def minimumVisitedCells(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
M, N = len(grid), len(grid[0])
if M == N == 1:
return 1
steps = [[None] * N for _ in xrange(M)]
visited = set()
split = ("#", "#")
target = (M - 1, N - 1)
queue = deque([(0, 0), split])
res = 1
row_max_reached = defaultdict(int)
col_max_reached = defaultdict(int)
while len(queue) > 1:
i, j = queue.popleft()
if i == "#":
res += 1
queue.append(split)
continue
start = min(N - 1, j + grid[i][j])
for dj in xrange(start, max(row_max_reached[i], j), -1):
nxt = (i, dj)
if nxt in visited:
continue
if nxt == target:
return res + 1
visited.add(nxt)
queue.append(nxt)
if j <= row_max_reached[i]:
row_max_reached[i] = j
start = min(M - 1, i + grid[i][j])
for di in xrange(start, max(col_max_reached[j], i), -1):
nxt = (di, j)
if nxt in visited:
continue
if nxt == target:
return res + 1
visited.add(nxt)
queue.append(nxt)
if i <= row_max_reached[j]:
row_max_reached[j] = i
return -1