Dada una matriz 2D no vacía grid
de 0 y 1, una isla es un grupo de 1
'(que representa la tierra) conectados en 4 direcciones (horizontal o vertical). Puede suponer que los cuatro bordes de la cuadrícula están rodeados de agua.
Cuenta el número de islas distintas . Una isla se considera igual a otra si y solo si una isla se puede traducir (y no girar o reflejar) para igualar a la otra.
Ejemplo 1:
11000 11000 00011 00011
Dado el mapa de cuadrícula anterior, regrese 1
.
Ejemplo 2
11011 10000 00001 11011
Idea: use una cadena para representar el estado de movimiento, luego cada forma es la misma, haga dfs, luego la cadena debe ser la misma. Tenga en cuenta que se debe agregar una "b" al final
Porque directamente abajo-> izquierda, no es equivalente a abajo-> deadend-> atrás-> izquierda; estos son dos métodos de movimiento diferentes;
class Solution {
public int numDistinctIslands(int[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int n = grid.length;
int m = grid[0].length;
HashSet<String> set = new HashSet<String>();
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(grid[i][j] == 1) {
StringBuilder sb = new StringBuilder();
dfs(grid, sb, i, j, "o");
set.add(sb.toString());
}
}
}
return set.size();
}
private int[] dx = {0,0,-1,1};
private int[] dy = {-1,1,0,0};
private void dfs(int[][] grid, StringBuilder sb, int x, int y, String direction) {
if(x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) {
return;
}
if(grid[x][y] == 1) {
grid[x][y] = 0;
sb.append(direction);
dfs(grid, sb, x + 1, y, "d");
dfs(grid, sb, x - 1, y, "u");
dfs(grid, sb, x, y + 1, "r");
dfs(grid, sb, x, y - 1, "l");
sb.append("b"); // 因为直接down -> left,不等同于down-> deadend -> back -> left;
}
}
}