

方法:dfs
- dfs的时候,记录搜索的路径,比如:上下左右
- 注意一种情况,有时候不同的岛屿,路径是一样的。
- 这是由于在不同位置回溯造成的,所以也要记录在哪里进行的回溯。


class Solution {
StringBuilder sb;
public int numDistinctIslands(int[][] grid) {
int m = grid.length, n = grid[0].length;
Set<String> set = new HashSet<>();
boolean[][] visited = new boolean[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1 && !visited[i][j]) {
sb = new StringBuilder();
dfs(grid, i, j, ' ', visited);
set.add(sb.toString());
}
}
}
return set.size();
}
public void dfs(int[][] grid, int i, int j, char dir, boolean[][] visited) {
int m = grid.length, n = grid[0].length;
if (i >= m || i < 0 || j >= n || j < 0) {
return;
}
if (visited[i][j] || grid[i][j] != 1) {
return;
}
visited[i][j] = true;
sb.append(dir);
dfs(grid, i + 1, j, 'D', visited);
dfs(grid, i - 1, j, 'U', visited);
dfs(grid, i, j + 1, 'R', visited);
dfs(grid, i, j - 1, 'L', visited);
sb.append('E');
}
}