leetcode733 (representación de imágenes: búsqueda de imágenes)

Hay una imagen representada por una matriz de números enteros bidimensionales. Cada número entero representa el valor de píxel de la imagen, y el valor está entre 0 y 65535.

Le da una coordenada (sr, sc) que representa el valor de píxel (fila, columna) en el que se renderiza la imagen, y un nuevo valor de color newColor, lo que le permite volver a colorear la imagen.

Para completar el trabajo de coloración, a partir de las coordenadas iniciales, registre los píxeles conectados con el mismo valor de píxel que las coordenadas iniciales en las cuatro direcciones de las coordenadas iniciales, y luego registre los cuatro píxeles que cumplen las condiciones en estas cuatro direcciones y sus cuatro correspondientes. Los píxeles conectados con el mismo valor de píxel que la coordenada inicial en la dirección, ..., repiten el proceso. Cambie el valor de color de todos los píxeles grabados al nuevo valor de color.

Finalmente, regrese a la imagen renderizada después de colorear.

Ejemplo:
Entrada:
imagen = [[1,1,1], [1,1,0], [1,0,1]]
sr = 1, sc = 1, newColor = 2
Salida: [[2,2, 2], [2,2,0], [2,0,1]]

Esta pregunta es un problema típico de búsqueda de gráficos. Cuando buscamos un cierto punto en el gráfico, solo necesitamos juzgar si el valor del punto cumple con los requisitos de la pregunta. Si se satisface, cámbielo al valor representado por newColor y Busque otros puntos alrededor de este punto. Si no está satisfecho, regrese directamente sin realizar ninguna operación. No busque otras direcciones en este punto.

Solución (1): DFS

class Solution {
    
    
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
    
    
            if(image.length==0||image[0].length==0)
                return image;
            boolean[][]search=new boolean[image.length][image[0].length];
            move(sr,sc,image,newColor,image[sr][sc],search);
            return image;
    }
    private void move(int x,int y,int[][]image,int newColor,int target,boolean[][] search){
    
    
        if(x<0||x>= image.length||y<0||y>=image[0].length)
            return;
        if(image[x][y]!=target||search[x][y])
            return;
        image[x][y]=newColor;
        search[x][y]=true;
        move(x+1,y,image,newColor,target,search);
        move(x-1,y,image,newColor,target,search);
        move(x,y+1,image,newColor,target,search);
        move(x,y-1,image,newColor,target,search);
    }
}

Solución de problemas (dos): BFS

class Solution {
    
    
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
    
    
            if(image.length==0||image[0].length==0)
                return image;
            boolean[][]search=new boolean[image.length][image[0].length];
            Queue<int[]>order=new LinkedList<>();
            int target=image[sr][sc];
            image[sr][sc]=newColor;
            order.add(new int[]{
    
    sr,sc});
            search[sr][sc]=true;
            while(!order.isEmpty()){
    
    
                int[]temp=order.poll();
                if(temp[0]+1< image.length&&!search[temp[0]+1][temp[1]]&&image[temp[0]+1][temp[1]]==target) {
    
    
                    order.add(new int[]{
    
    temp[0] + 1, temp[1]});
                    search[temp[0]+1][temp[1]]=true;
                    image[temp[0]+1][temp[1]]=newColor;
                }
                if(temp[0]-1>=0&&!search[temp[0]-1][temp[1]]&&image[temp[0]-1][temp[1]]==target) {
    
    
                    order.add(new int[]{
    
    temp[0] - 1, temp[1]});
                    search[temp[0]-1][temp[1]]=true;
                    image[temp[0]-1][temp[1]]=newColor;
                }
                if(temp[1]+1< image[1].length&&!search[temp[0]][temp[1]+1]&&image[temp[0]][temp[1]+1]==target) {
    
    
                    order.add(new int[]{
    
    temp[0], temp[1]+1});
                    search[temp[0]][temp[1]+1]=true;
                    image[temp[0]][temp[1]+1]=newColor;
                }
                if(temp[1]-1>=0&&!search[temp[0]][temp[1]-1]&&image[temp[0]][temp[1]-1]==target) {
    
    
                    order.add(new int[]{
    
    temp[0] , temp[1]-1});
                    search[temp[0]][temp[1]-1]=true;
                    image[temp[0]][temp[1]-1]=newColor;
                }
            }
            return image;
    }

}

Supongo que te gusta

Origin blog.csdn.net/CY2333333/article/details/108034024
Recomendado
Clasificación