This approach involves using Breadth-First Search (BFS) to precompute the minimum Manhattan distance from each cell to any thief in the grid, and then using this information to find the maximum safeness factor for reaching the bottom-right corner.
Time Complexity: O(n2 log n), where n is the grid size, due to the Dijkstra-like process.
Space Complexity: O(n2) for storing distances and safeness factors.
1class SafestPathFinder {
2 constructor() {
3 this.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
4 }
5
6 maxSafenessFactor(grid) {
7 const n = grid.length;
8 const distance = Array.from({ length: n }, () => Array(n).fill(Infinity));
9 const queue = [];
10
11 for (let r = 0; r < n; r++) {
12 for (let c = 0; c < n; c++) {
13 if (grid[r][c] === 1) {
14 queue.push([r, c]);
15 distance[r][c] = 0;
16 }
17 }
18 }
19
20 let idx = 0;
21 while (idx < queue.length) {
22 const [r, c] = queue[idx++];
23 for (const [dr, dc] of this.directions) {
24 const nr = r + dr, nc = c + dc;
25 if (nr >= 0 && nr < n && nc >= 0 && nc < n && distance[nr][nc] === Infinity) {
26 distance[nr][nc] = distance[r][c] + 1;
27 queue.push([nr, nc]);
28 }
29 }
30 }
31
32 const heap = new MaxPriorityQueue({ priority: x => x[2] });
33 heap.enqueue([0, 0, distance[0][0]]);
34
35 const visited = Array.from({ length: n }, () => Array(n).fill(false));
36
37 while (!heap.isEmpty()) {
38 const { element: [r, c, safeness] } = heap.dequeue();
39 if (r === n - 1 && c === n - 1) return safeness;
40 if (visited[r][c]) continue;
41 visited[r][c] = true;
42
43 for (const [dr, dc] of this.directions) {
44 const nr = r + dr, nc = c + dc;
45 if (nr >= 0 && nr < n && nc >= 0 && nc < n && !visited[nr][nc]) {
46 const newSafeness = Math.min(safeness, distance[nr][nc]);
47 heap.enqueue([nr, nc, newSafeness]);
48 }
49 }
50 }
51 return 0;
52 }
53}
54
55const spf = new SafestPathFinder();
56const grid = [[0, 0, 1], [0, 0, 0], [0, 0, 0]];
57console.log(spf.maxSafenessFactor(grid)); // Output: 2
58
JavaScript solution leverages a BFS to determine distances from each grid cell to thieves, followed by a priority-based strategy using a max-heap to compile the path with the greatest safeness factor.
This approach considers processing from both the starting and ending points in a bidirectional BFS style, potentially meeting in the middle for optimized distance calculations and safeness factor determination.
Time Complexity: O(n2) due to simultaneous BFS processing.
Space Complexity: O(n2) as distances from both ends are computed.
1class SafestPathFinder {
2 constructor() {
3 this.directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
4 }
5
6 bidirectionalSafenessFactor(grid) {
7 const n = grid.length;
8 const distFromStart = Array.from({ length: n }, () => Array(n).fill(Infinity));
9 const distFromEnd = Array.from({ length: n }, () => Array(n).fill(Infinity));
10
11 const startQueue = [[0, 0]];
12 distFromStart[0][0] = 0;
13
14 const endQueue = [[n - 1, n - 1]];
15 distFromEnd[n - 1][n - 1] = 0;
16
17 while (startQueue.length || endQueue.length) {
18 if (startQueue.length) {
19 const [r, c] = startQueue.shift();
20 for (const [dr, dc] of this.directions) {
21 const nr = r + dr, nc = c + dc;
22 if (nr >= 0 && nr < n && nc >= 0 && nc < n && distFromStart[nr][nc] === Infinity) {
23 distFromStart[nr][nc] = distFromStart[r][c] + 1;
24 startQueue.push([nr, nc]);
25 }
26 }
27 }
28
29 if (endQueue.length) {
30 const [r, c] = endQueue.shift();
31 for (const [dr, dc] of this.directions) {
32 const nr = r + dr, nc = c + dc;
33 if (nr >= 0 && nr < n && nc >= 0 && nc < n && distFromEnd[nr][nc] === Infinity) {
34 distFromEnd[nr][nc] = distFromEnd[r][c] + 1;
35 endQueue.push([nr, nc]);
36 }
37 }
38 }
39
40 // Check overlap
41 for (let i = 0; i < n; ++i) {
42 for (let j = 0; j < n; ++j) {
43 if (distFromStart[i][j] !== Infinity && distFromEnd[i][j] !== Infinity) {
44 return distFromStart[i][j] + distFromEnd[i][j];
45 }
46 }
47 }
48 }
49
50 return -1;
51 }
52}
53
54const spf = new SafestPathFinder();
55const grid = [[0, 0, 1], [0, 0, 0], [0, 0, 0]];
56console.log(spf.bidirectionalSafenessFactor(grid)); // Output: Safeness factor
57
The JavaScript interface executes bidirectional BFS starting from both ends, with simultaneous processing enhancing the invulnerability factor calculation through effective intersection detection.