class Solution {
private static int[][] DIR = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
private Set<String> islands = new HashSet<>();
public int numDistinctIslands(int[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) {
StringBuilder path = new StringBuilder();
dfs(grid, i, j, path, new int[]{i, j});
islands.add(path.toString());
}
}
}
return islands.size();
}
private void dfs(int[][] grid, int i, int j, StringBuilder path, int[] start) {
if (!isValid(grid, i, j)) return;
grid[i][j] = 0;
path.append((i - start[0]) + " " + (j - start[1]));
for (int[] dir : DIR) {
dfs(grid, i+dir[0], j+dir[1], path, start);
}
}
private boolean isValid(int[][] grid, int i, int j) {
int m = grid.length;
int n = grid[0].length;
if (i >= 0 && i < m && j >= 0 && j < n) {
return grid[i][j] == 1;
}
return false;
}
}