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
| class Solution { public int maximumSafenessFactor(List<List<Integer>> g) { n = g.size(); grid = new int[n][n]; dist = new int[n][n]; Queue<int[]> queue = new LinkedList<>(); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { grid[i][j] = g.get(i).get(j); dist[i][j] = -1; if (grid[i][j] == 1) { dist[i][j] = 0; queue.offer(new int[]{i, j}); } } } while (!queue.isEmpty()) { int[] node = queue.poll(); for (int[] dir : dirs) { int row = node[0] + dir[0], col = node[1] + dir[1]; if (isValid(row, col) && dist[row][col] == -1) { queue.offer(new int[]{row, col}); dist[row][col] = dist[node[0]][node[1]] + 1; } } } int l = 0, r = (n - 1) << 1; while (l <= r) { int mid = (l + r) >> 1; if (check(mid)) l = mid + 1; else r = mid - 1; } return r; }
private boolean check(int minDist) { if (dist[0][0] < minDist) return false; boolean[][] visited = new boolean[n][n]; return dfs(0, 0, minDist, visited); }
private boolean dfs(int i, int j, int minDist, boolean[][] visited) { if (i == n -1 && j == n - 1) return true; visited[i][j] = true; for (int[] dir : dirs) { int row = i + dir[0], col = j + dir[1]; if (isValid(row, col) && !visited[row][col] && dist[row][col] >= minDist) { if (dfs(row, col, minDist, visited)) return true; } } return false; }
private boolean isValid(int i, int j) { return i >=0 && j >= 0 && i < n && j < n; }
int[][] grid, dist, dirs = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int n; }
|