public class Solution { record Position(int x, int y) { public bool InBounds(int width, int height) => y >= 0 && y < height && x >= 0 && x < width; public static IEnumerable Grid(int width, int height) { for (var y = 0; y < height; ++y) { for (var x = 0; x < width; ++x) { yield return new(x, y); } } } public static Position operator +(Position lhs, Position rhs) => new(lhs.x + rhs.x, lhs.y + rhs.y); } private static readonly int WATER = 0; private static readonly int ISLAND = 1; private static readonly List DIRECTIONS = [ new Position(0, 1), new Position(0, -1), new Position(1, 0), new Position(-1, 0), ]; private void Explore(int[][] grid, bool[,] visited, Position cell) { var (width, height) = (grid[0].Length, grid.Length); bool toVisit(Position p) => p.InBounds(width, height) && grid[p.y][p.x] == ISLAND && !visited[p.y, p.x]; var q = new Queue(); q.Enqueue(cell); visited[cell.y, cell.x] = true; while (q.TryDequeue(out var p)) { foreach (var direction in DIRECTIONS) { var next = p + direction; if (toVisit(next)) { q.Enqueue(next); visited[next.y, next.x] = true; } } } } private int CountIslands(int[][] grid) { var (width, height) = (grid[0].Length, grid.Length); var visited = new bool[height, width]; var islands = 0; foreach (var cell in Position.Grid(width, height)) { if (!visited[cell.y, cell.x] && grid[cell.y][cell.x] == ISLAND) { Explore(grid, visited, cell); ++islands; } } return islands; } public int MinDays(int[][] grid) { var (width, height) = (grid[0].Length, grid.Length); var islands = CountIslands(grid); if (islands != 1) { return 0; } foreach (var p in Position.Grid(width, height)) { if (grid[p.y][p.x] == WATER) { continue; } grid[p.y][p.x] = WATER; islands = CountIslands(grid); if (islands != 1) { return 1; } grid[p.y][p.x] = ISLAND; } return 2; } }