-
-
Notifications
You must be signed in to change notification settings - Fork 9k
/
Copy pathSolution.ts
81 lines (81 loc) · 2.56 KB
/
Solution.ts
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
81
function maximumMinutes(grid: number[][]): number {
const m = grid.length;
const n = grid[0].length;
const fire = Array.from({ length: m }, () => Array.from({ length: n }, () => false));
const vis = Array.from({ length: m }, () => Array.from({ length: n }, () => false));
const dirs: number[] = [-1, 0, 1, 0, -1];
let [l, r] = [-1, m * n];
const spread = (q: number[][]): number[][] => {
const nq: number[][] = [];
while (q.length) {
const [i, j] = q.shift()!;
for (let k = 0; k < 4; ++k) {
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
if (x >= 0 && x < m && y >= 0 && y < n && !fire[x][y] && grid[x][y] === 0) {
fire[x][y] = true;
nq.push([x, y]);
}
}
}
return nq;
};
const check = (t: number): boolean => {
for (let i = 0; i < m; ++i) {
fire[i].fill(false);
vis[i].fill(false);
}
let q1: number[][] = [];
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
if (grid[i][j] === 1) {
q1.push([i, j]);
fire[i][j] = true;
}
}
}
for (; t && q1.length; --t) {
q1 = spread(q1);
}
if (fire[0][0]) {
return false;
}
const q2: number[][] = [[0, 0]];
vis[0][0] = true;
for (; q2.length; q1 = spread(q1)) {
for (let d = q2.length; d; --d) {
const [i, j] = q2.shift()!;
if (fire[i][j]) {
continue;
}
for (let k = 0; k < 4; ++k) {
const [x, y] = [i + dirs[k], j + dirs[k + 1]];
if (
x >= 0 &&
x < m &&
y >= 0 &&
y < n &&
!vis[x][y] &&
!fire[x][y] &&
grid[x][y] === 0
) {
if (x === m - 1 && y === n - 1) {
return true;
}
vis[x][y] = true;
q2.push([x, y]);
}
}
}
}
return false;
};
while (l < r) {
const mid = (l + r + 1) >> 1;
if (check(mid)) {
l = mid;
} else {
r = mid - 1;
}
}
return l === m * n ? 1e9 : l;
}