Cantidad de islas distintas

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;
        }
    }
}

 

710 artículos originales publicados · Me gusta 13 · Visitas 190,000+

Supongo que te gusta

Origin blog.csdn.net/u013325815/article/details/105446396
Recomendado
Clasificación