2
int[][] dir = new int[][] {{0, -1}, {-1, 0}, {1, 0}, {0, 1}};4
public int latestDayToCross(int row, int col, int[][] cells) {5
int grid[][] = new int[row][col];6
int low = 0, high = cells.length - 1;10
int mid = low + (high - low) / 2;12
for (int i = 0; i <= mid; i++) grid[cells[i][0] - 1][cells[i][1] - 1] = 1;14
if (helper(grid, new boolean[row][col])) {17
} else high = mid - 1;19
for (int i = 0; i < grid.length; i++) for (int j = 0; j < grid[i].length; j++) grid[i][j] = 0;25
public boolean helper(int[][] grid, boolean[][] visited) {26
for (int i = 0; i < grid[0].length; i++)27
if (grid[0][i] == 0 && !visited[0][i] && safe(0, i, grid, visited)) return true;31
public boolean safe(int i, int j, int[][] cells, boolean[][] visited) {34
|| i >= visited.length35
|| j >= visited[i].length37
|| cells[i][j] == 1) return false;38
if (i == cells.length - 1 && j < cells[i].length && cells[i][j] == 0) return true;41
for (int k = 0; k < dir.length; k++)42
if (safe(i + dir[k][0], j + dir[k][1], cells, visited)) return true;