forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution.go
80 lines (77 loc) · 1.53 KB
/
Solution.go
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
func maximumMinutes(grid [][]int) int {
m, n := len(grid), len(grid[0])
dirs := []int{-1, 0, 1, 0, -1}
spread := func(fire [][]bool, q [][]int) [][]int {
nf := [][]int{}
for len(q) > 0 {
p := q[0]
q = q[1:]
for k := 0; k < 4; k++ {
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
if x >= 0 && x < m && y >= 0 && y < n && !fire[x][y] && grid[x][y] == 0 {
fire[x][y] = true
nf = append(nf, []int{x, y})
}
}
}
return nf
}
check := func(t int) bool {
fire := make([][]bool, m)
vis := make([][]bool, m)
f := [][]int{}
for i, row := range grid {
fire[i] = make([]bool, n)
vis[i] = make([]bool, n)
for j, v := range row {
if v == 1 {
fire[i][j] = true
f = append(f, []int{i, j})
}
}
}
for t > 0 && len(f) > 0 {
f = spread(fire, f)
t--
}
if fire[0][0] {
return false
}
q := [][]int{{0, 0}}
vis[0][0] = true
for len(q) > 0 {
for i := len(q); i > 0; i-- {
p := q[0]
q = q[1:]
if fire[p[0]][p[1]] {
continue
}
for k := 0; k < 4; k++ {
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
if x >= 0 && x < m && y >= 0 && y < n && !fire[x][y] && !vis[x][y] && grid[x][y] == 0 {
if x == m-1 && y == n-1 {
return true
}
vis[x][y] = true
q = append(q, []int{x, y})
}
}
}
f = spread(fire, f)
}
return false
}
left, right := -1, m*n
for left < right {
mid := (left + right + 1) >> 1
if check(mid) {
left = mid
} else {
right = mid - 1
}
}
if left == m*n {
return int(1e9)
}
return left
}