Skip to content

Commit d5c3b3f

Browse files
authored
Update escape-the-spreading-fire.py
1 parent 886dfc1 commit d5c3b3f

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

Python/escape-the-spreading-fire.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Time: O(m * n)
22
# Space: O(m * n)
33

4+
import collections
5+
6+
47
# bfs
58
class Solution(object):
69
def maximumMinutes(self, grid):
@@ -12,12 +15,7 @@ def maximumMinutes(self, grid):
1215
GRASS, FIRE, WALL, PERSON = range(4)
1316
INF = 10**9
1417
def bfs(grid):
15-
time = {FIRE:{(len(grid)-1, len(grid[0])-1):INF,
16-
(len(grid)-1, len(grid[0])-2):INF,
17-
(len(grid)-2, len(grid[0])-1):INF},
18-
PERSON:{(len(grid)-1, len(grid[0])-1):INF,
19-
(len(grid)-1, len(grid[0])-2):INF,
20-
(len(grid)-2, len(grid[0])-1):INF}}
18+
time = collections.defaultdict(int)
2119
d = 0
2220
q = [(r, c, FIRE) for r in xrange(len(grid)) for c in xrange(len(grid[0])) if grid[r][c] == FIRE]
2321
q.append((0, 0, PERSON))
@@ -29,25 +27,25 @@ def bfs(grid):
2927
if not (0 <= nr < len(grid) and 0 <= nc < len(grid[0]) and
3028
grid[nr][nc] != WALL and
3129
((t == FIRE and grid[nr][nc] != FIRE) or
32-
(t == PERSON and (grid[nr][nc] == GRASS or (grid[nr][nc] == FIRE and (nr, nc) == (len(grid)-1, len(grid[0])-1) and d+1 == time[FIRE][nr, nc]))))):
30+
(t == PERSON and (grid[nr][nc] == GRASS or (grid[nr][nc] == FIRE and (nr, nc) == (len(grid)-1, len(grid[0])-1) and d+1 == time[FIRE, nr, nc]))))):
3331
continue
3432
if grid[nr][nc] != FIRE:
3533
grid[nr][nc] = t
36-
if (nr, nc) in time[t]:
37-
time[t][nr, nc] = d+1
34+
if (nr, nc) in ((len(grid)-1, len(grid[0])-1), (len(grid)-1, len(grid[0])-2), (len(grid)-2, len(grid[0])-1)):
35+
time[t, nr, nc] = d+1
3836
new_q.append((nr, nc, t))
3937
q = new_q
4038
d += 1
4139
return time
4240

4341
time = bfs(grid)
44-
if time[PERSON][len(grid)-1, len(grid[0])-1] == INF:
42+
if not time[PERSON, len(grid)-1, len(grid[0])-1]:
4543
return -1
46-
if time[FIRE][len(grid)-1, len(grid[0])-1] == INF:
44+
if not time[FIRE, len(grid)-1, len(grid[0])-1]:
4745
return INF
48-
diff = time[FIRE][len(grid)-1, len(grid[0])-1]-time[PERSON][len(grid)-1, len(grid[0])-1]
49-
return diff if diff+2 in (time[FIRE][len(grid)-1, len(grid[0])-2]-time[PERSON][len(grid)-1, len(grid[0])-2],
50-
time[FIRE][len(grid)-2, len(grid[0])-1]-time[PERSON][len(grid)-2, len(grid[0])-1]) else diff-1
46+
diff = time[FIRE, len(grid)-1, len(grid[0])-1]-time[PERSON, len(grid)-1, len(grid[0])-1]
47+
return diff if diff+2 in (time[FIRE, len(grid)-1, len(grid[0])-2]-time[PERSON, len(grid)-1, len(grid[0])-2],
48+
time[FIRE, len(grid)-2, len(grid[0])-1]-time[PERSON, len(grid)-2, len(grid[0])-1]) else diff-1
5149

5250

5351
# Time: O(m * n)

0 commit comments

Comments
 (0)