Understanding the Problem
We are given a 2D grid consisting of 0s and 1s. Here, '1' represents land, and '0' represents water. An island is a group of connected 1s in the grid, where connections are allowed only in four directions—up, down, left, and right.
Our goal is to count how many distinct island shapes exist. Two islands are considered the same if they have the same shape when shifted to the same origin. That means rotation and flipping do not count; only translation (shifting) is allowed when comparing shapes.
Step-by-Step Solution with Example
step 1: Traverse the grid to find unvisited land cells
We start scanning the grid from the top-left corner. When we encounter a cell with value 1 that hasn't been visited yet, it means we've found the start of a new island.
step 2: Perform DFS to explore the full island
From the current cell, we perform a Depth-First Search (DFS) in all four directions. For each direction we move, we add a corresponding character to a path string to encode the shape. For example, 'U' for up, 'D' for down, 'L' for left, 'R' for right.
step 3: Add backtracking information to avoid false matches
Every time we finish a recursive DFS call and go back to the previous cell, we add a special symbol, such as 'B' for backtrack. This helps us capture the exact structure of the island. For instance, a line and a zig-zag of the same length would produce different signatures.
step 4: Store the encoded shape in a set
Once the DFS is complete for an island, we add the shape signature to a set. This ensures we only keep unique shapes.
step 5: Count the number of unique shapes
At the end of the traversal, the number of distinct islands is simply the size of the set that stores the shape signatures.
Example
Input:
[
[1,1,0,0,0],
[1,0,0,0,0],
[0,0,0,1,1],
[0,0,0,1,1]
]
We find two islands:
- The first one on the top-left forms a shape with path: "DRB"
- The second one on the bottom-right has the same shape: "DRB"
Even though they are in different locations, their shapes are the same, so the output is: 1
Edge Cases
- Empty Grid: If the grid is empty, we return 0 since there are no islands.
- All Water: If every cell is 0, there’s no land to explore. Output is 0.
- All Land: If every cell is 1, there’s one big island. So, output is 1.
- Same Size but Different Shapes: If two islands have the same number of cells but different layouts, they are still considered distinct.
- Multiple Identical Shapes: If multiple islands have the same shape, they’re only counted once because we use a set to store unique patterns.
Finally
This problem helps build a strong foundation in graph traversal and pattern recognition. The key idea is not just visiting islands, but encoding their traversal paths uniquely to compare their shapes. Using DFS with shape encoding and backtracking gives us a reliable way to distinguish islands by structure.
Always consider boundary conditions and edge cases before finalizing your solution. Sets are a powerful way to track distinct patterns without worrying about duplicates.