class Solution {
    private lateinit var visited: Array<BooleanArray>
    private var count: Int = 0
    fun numIslands(grid: Array<CharArray>): Int {
        visited = Array(grid.size) { BooleanArray(grid[0].size) }
        count = 0

        for (i in grid.indices) {
            for (j in grid[0].indices) {
                if (dfs(grid, i, j)) {
                    count++
                }
            }
        }

        return count
    }

    private fun dfs(grid: Array<CharArray>, x: Int, y: Int): Boolean {
        if (x < 0 || x >= grid.size || y < 0 || y >= grid[0].size) return false
        if (grid[x][y] == '0' || visited[x][y]) return false

        visited[x][y] = true
        dfs(grid, x - 1, y)
        dfs(grid, x + 1, y)
        dfs(grid, x, y - 1)
        dfs(grid, x, y + 1)
        return true
    }
}