Bird
Raised Fist0
DSA Goprogramming~10 mins

Number of Islands BFS and DFS in DSA Go - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to start BFS from the given cell.

DSA Go
func bfs(grid [][]byte, visited [][]bool, row int, col int) {
    queue := [][]int{{row, col}}
    visited[row][col] = true
    directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}

    for len(queue) > 0 {
        cell := queue[0]
        queue = queue[1:]
        r, c := cell[0], cell[1]

        for _, dir := range directions {
            nr, nc := r+dir[0], c+dir[1]
            if nr >= 0 && nr < len(grid) && nc >= 0 && nc < len(grid[0]) && grid[nr][nc] == '1' && !visited[nr][nc] {
                queue = append(queue, []int{nr, nc})
                visited[nr][nc] = [1]
            }
        }
    }
}
Drag options to blanks, or click blank then click option'
Afalse
Bvisited
Ctrue
Dgrid[nr][nc]
Attempts:
3 left
💡 Hint
Common Mistakes
Forgetting to mark the cell as visited.
Marking visited after popping from the queue instead of when adding.
2fill in blank
medium

Complete the DFS function to explore all connected land cells.

DSA Go
func dfs(grid [][]byte, visited [][]bool, row int, col int) {
    if row < 0 || row >= len(grid) || col < 0 || col >= len(grid[0]) || grid[row][col] == '0' || visited[row][col] {
        return
    }
    visited[row][col] = true
    directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
    for _, dir := range directions {
        dfs(grid, visited, row+[1], col+dir[1])
    }
}
Drag options to blanks, or click blank then click option'
Adir[0]
Bdir[1]
Crow
Dcol
Attempts:
3 left
💡 Hint
Common Mistakes
Using the same direction index for both row and column.
Not checking boundaries before recursion.
3fill in blank
hard

Fix the error in the DFS call to correctly explore neighbors.

DSA Go
func dfs(grid [][]byte, visited [][]bool, row int, col int) {
    if row < 0 || row >= len(grid) || col < 0 || col >= len(grid[0]) || grid[row][col] == '0' || visited[row][col] {
        return
    }
    visited[row][col] = true
    directions := [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
    for _, dir := range directions {
        dfs(grid, visited, row+dir[0], col+[1])
    }
}
Drag options to blanks, or click blank then click option'
Adir[0]
Bcol
Crow
Ddir[1]
Attempts:
3 left
💡 Hint
Common Mistakes
Using dir[0] for both row and column updates.
Swapping row and column indices.
4fill in blank
hard

Fill both blanks to count islands using BFS.

DSA Go
func numIslands(grid [][]byte) int {
    if len(grid) == 0 {
        return 0
    }
    visited := make([][]bool, len(grid))
    for i := range visited {
        visited[i] = make([]bool, len(grid[0]))
    }
    count := 0
    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            if grid[i][j] == '1' && !visited[i][j] {
                [1](grid, visited, i, j)
                count[2]
            }
        }
    }
    return count
}
Drag options to blanks, or click blank then click option'
Abfs
Bdfs
C++
D--
Attempts:
3 left
💡 Hint
Common Mistakes
Calling dfs instead of bfs.
Decrementing count instead of incrementing.
5fill in blank
hard

Fill all three blanks to count islands using DFS.

DSA Go
func numIslandsDFS(grid [][]byte) int {
    if len(grid) == 0 {
        return 0
    }
    visited := make([][]bool, len(grid))
    for i := range visited {
        visited[i] = make([]bool, len(grid[0]))
    }
    count := 0
    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            if grid[i][j] == '1' && !visited[i][j] {
                [1](grid, visited, i, j)
                count[2]
            }
        }
    }
    return count
}
Drag options to blanks, or click blank then click option'
Adfs
B++
C--
Dbfs
Attempts:
3 left
💡 Hint
Common Mistakes
Calling bfs instead of dfs.
Decrementing count instead of incrementing.

Practice

(1/5)
1. What does the "Number of Islands" problem ask you to find in a grid of '1's and '0's?
easy
A. Count how many groups of connected '1's (islands) are in the grid
B. Find the largest island size
C. Count all '0's in the grid
D. Calculate the perimeter of islands

Solution

  1. Step 1: Understand the grid content

    The grid contains '1's representing land and '0's representing water.
  2. Step 2: Define the problem goal

    We need to count how many separate groups of connected '1's (islands) exist.
  3. Final Answer:

    Count how many groups of connected '1's (islands) are in the grid -> Option A
  4. Quick Check:

    Number of islands = count of connected '1' groups [OK]
Hint: Islands = connected '1's groups in grid [OK]
Common Mistakes:
  • Counting individual '1's instead of groups
  • Confusing '0's as islands
  • Trying to find island size instead of count
2. Which of the following Go code snippets correctly starts a DFS from cell (i, j) in a grid to mark connected land?
easy
A. func dfs(grid [][]byte, i, j int) { if grid[i][j] == '1' { grid[i][j] = '1' } }
B. func dfs(grid [][]byte, i, j int) { for i < len(grid) { for j < len(grid[0]) { grid[i][j] = '0' } } }
C. func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { return } grid[i][j] = '0'; dfs(grid, i+1, j); dfs(grid, i-1, j); dfs(grid, i, j+1); dfs(grid, i, j-1) }
D. func dfs(grid [][]byte, i, j int) { if i > len(grid) || j > len(grid[0]) { return } grid[i][j] = '1' }

Solution

  1. Step 1: Check boundary and water conditions

    func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { return } grid[i][j] = '0'; dfs(grid, i+1, j); dfs(grid, i-1, j); dfs(grid, i, j+1); dfs(grid, i, j-1) } correctly checks if indices are out of bounds or cell is water ('0'), then returns.
  2. Step 2: Mark current land as visited and recurse

    func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { return } grid[i][j] = '0'; dfs(grid, i+1, j); dfs(grid, i-1, j); dfs(grid, i, j+1); dfs(grid, i, j-1) } marks current cell as '0' to avoid revisiting and calls dfs on neighbors up, down, left, right.
  3. Final Answer:

    func dfs(grid [][]byte, i, j int) { if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' { return } grid[i][j] = '0'; dfs(grid, i+1, j); dfs(grid, i-1, j); dfs(grid, i, j+1); dfs(grid, i, j-1) } -> Option C
  4. Quick Check:

    DFS marks visited land and explores neighbors [OK]
Hint: Check boundaries and mark visited before recursive calls [OK]
Common Mistakes:
  • Not checking boundaries before access
  • Not marking visited cells
  • Using wrong loop instead of recursion
3. What is the output of the following Go code that counts islands using BFS on this grid?
grid := [][]byte{
  {'1','1','0','0','0'},
  {'1','1','0','0','0'},
  {'0','0','1','0','0'},
  {'0','0','0','1','1'},
}
count := numIslands(grid)
fmt.Println(count)

func numIslands(grid [][]byte) int {
  rows, cols := len(grid), len(grid[0])
  count := 0
  directions := [][]int{{1,0},{-1,0},{0,1},{0,-1}}
  for i := 0; i < rows; i++ {
    for j := 0; j < cols; j++ {
      if grid[i][j] == '1' {
        count++
        queue := [][]int{{i,j}}
        grid[i][j] = '0'
        for len(queue) > 0 {
          r, c := queue[0][0], queue[0][1]
          queue = queue[1:]
          for _, d := range directions {
            nr, nc := r+d[0], c+d[1]
            if nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr][nc] == '1' {
              queue = append(queue, []int{nr,nc})
              grid[nr][nc] = '0'
            }
          }
        }
      }
    }
  }
  return count
}
medium
A. 1
B. 3
C. 4
D. 2

Solution

  1. Step 1: Identify islands in the grid

    There are three groups of connected '1's: top-left block, middle single '1', bottom-right block.
  2. Step 2: BFS marks visited and counts islands

    Each BFS call marks one island, so count increments 3 times.
  3. Final Answer:

    3 -> Option B
  4. Quick Check:

    Count islands = 3 [OK]
Hint: Count BFS runs triggered by unvisited '1's [OK]
Common Mistakes:
  • Counting connected '1's individually
  • Not marking visited cells
  • Miscounting overlapping islands
4. The following DFS code for counting islands has a bug. What is the main issue?
func dfs(grid [][]byte, i, j int) {
  if i < 0 || j < 0 || i > len(grid) || j > len(grid[0]) || grid[i][j] == '0' {
    return
  }
  grid[i][j] = '0'
  dfs(grid, i+1, j)
  dfs(grid, i-1, j)
  dfs(grid, i, j+1)
  dfs(grid, i, j-1)
}
medium
A. Boundary checks use '>' instead of '>=' causing out-of-range errors
B. It does not mark visited cells
C. It uses BFS instead of DFS
D. It does not check if grid[i][j] is '1'

Solution

  1. Step 1: Analyze boundary conditions

    The code uses 'i > len(grid)' and 'j > len(grid[0])' which allows i or j to equal length, causing index out of range.
  2. Step 2: Correct boundary check

    It should use 'i >= len(grid)' and 'j >= len(grid[0])' to prevent invalid access.
  3. Final Answer:

    Boundary checks use '>' instead of '>=' causing out-of-range errors -> Option A
  4. Quick Check:

    Use '>=' for boundary checks to avoid errors [OK]
Hint: Use '>=' for boundary checks in arrays [OK]
Common Mistakes:
  • Using '>' instead of '>=' in boundary checks
  • Forgetting to mark visited cells
  • Mixing BFS and DFS logic
5. Given a grid where diagonal connections also count as connected land, how would you modify the BFS or DFS approach to count islands correctly?
hard
A. Count islands without marking visited cells
B. Only check horizontal neighbors, ignore vertical and diagonal
C. Use BFS only without any direction changes
D. Add diagonal directions (top-left, top-right, bottom-left, bottom-right) to the neighbors list

Solution

  1. Step 1: Understand connection rules

    Diagonal connections mean neighbors include 8 directions, not just 4 (up, down, left, right).
  2. Step 2: Modify neighbor directions

    Add diagonal directions: (-1,-1), (-1,1), (1,-1), (1,1) to the directions list used in BFS/DFS.
  3. Final Answer:

    Add diagonal directions (top-left, top-right, bottom-left, bottom-right) to the neighbors list -> Option D
  4. Quick Check:

    Include diagonals in neighbors for diagonal connectivity [OK]
Hint: Add diagonals to directions for 8-way connectivity [OK]
Common Mistakes:
  • Ignoring diagonal neighbors
  • Not updating directions list
  • Counting without marking visited
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard