1
1
# Time: O(m * n)
2
2
# Space: O(m * n)
3
3
4
+ import collections
5
+
6
+
4
7
# bfs
5
8
class Solution (object ):
6
9
def maximumMinutes (self , grid ):
@@ -12,12 +15,7 @@ def maximumMinutes(self, grid):
12
15
GRASS , FIRE , WALL , PERSON = range (4 )
13
16
INF = 10 ** 9
14
17
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 )
21
19
d = 0
22
20
q = [(r , c , FIRE ) for r in xrange (len (grid )) for c in xrange (len (grid [0 ])) if grid [r ][c ] == FIRE ]
23
21
q .append ((0 , 0 , PERSON ))
@@ -29,25 +27,25 @@ def bfs(grid):
29
27
if not (0 <= nr < len (grid ) and 0 <= nc < len (grid [0 ]) and
30
28
grid [nr ][nc ] != WALL and
31
29
((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 ]))))):
33
31
continue
34
32
if grid [nr ][nc ] != FIRE :
35
33
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
38
36
new_q .append ((nr , nc , t ))
39
37
q = new_q
40
38
d += 1
41
39
return time
42
40
43
41
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 ]:
45
43
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 ]:
47
45
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
51
49
52
50
53
51
# Time: O(m * n)
0 commit comments