Solución del problema de Leikou: 542 puntos de conocimiento de la matriz del problema 01: BFS de múltiples fuentes (determinar el nivel de recorrido actual o no dos tipos de plantillas) utilizado para encontrar la distancia más corta

1. Descripción del título : enlace del título
Dada una matriz que consta de 0 y 1, averigüe la distancia entre cada elemento y el 0 más cercano.
La distancia entre dos elementos adyacentes es 1.
Ejemplo 1:
Entrada:
0 0 0
0 1 0
0 0 0
Salida:
0 0 0
0 1 0
0 0 0
Nota:
El número de elementos en la matriz dada no excede 10,000.
Al menos un elemento en la matriz dada es 0.
Los elementos de la matriz solo son adyacentes en cuatro direcciones: arriba, abajo, izquierda y derecha.

2. Idea: Comprenda cuál es el tema a investigar, ¡la tarea restante es configurar la plantilla!
a) Primero miraBusque la distancia en la matriz y piense en la solución del gráfico.
b) Esta pregunta ofrece un escenario: encuentre la distancia más corta de 1 a 0.En un gráfico, el método para encontrar la distancia más corta desde un punto es fácil de considerar como BFS, Es decir, después de buscar en el círculo circundante, busque el siguiente círculo, que es expandir lentamente el rango de búsqueda.

2.1 Plantilla BFS:
BFS usa una cola, coloca cada punto que no se ha buscado en la cola uno por uno y luego muestra el elemento principal de la cola como el punto transversal actual. BFS tiene dos plantillas en total:
a) Si no es necesario determinar qué nivel se atraviesa actualmente, la plantilla BFS es la siguiente:

while queue 不空:
    cur = queue.pop()
    for 节点 in cur的所有相邻节点:
        if 该节点有效且未访问过:
            queue.push(该节点)

b) Si desea determinar qué capa se atraviesa actualmente, la plantilla BFS es la siguiente:
aquíEl nivel agregado indica qué nivel del árbol binario se atraviesa actualmente, también se puede entender como cuántos pasos se han dado en un gráfico.. El tamaño indica cuántos elementos hay en la capa transversal actual, es decir, la cantidad de elementos en la cola. Atravesamos estos elementos a la vez, es decir, llevamos todos los elementos de la capa actual un paso hacia afuera.

level = 0
while queue 不空:
    size = queue.size() // 记录当前层次
    while (size --) {
    
    
        cur = queue.pop()
        for 节点 in cur的所有相邻节点:
            if 该节点有效且未被访问过:
                queue.push(该节点)
    }
    level ++;

Las dos anteriores son plantillas generales, que se pueden usar en cualquier tema, ¡solo recuerde!
Ideas de enlaces, autor: fuxuemingzhu

3. La diferencia entre BFS de múltiples fuentes y BFS de fuente única:
3.1. Ideas:

  • para "BFS de árbol" (típico "BFS de fuente única")Todo el mundo ya está familiarizado con el
    camino : primero ingrese el nodo raíz en el equipo y luego recorra capa por capa sin pensar.
  • para "BFS gráfico" ("BFS de múltiples fuentes"), Y la diferencia entre "Tree's BFS" preste atención a los dos siguientes: El
    árbol tiene solo 1 raíz y el gráfico puede tener múltiples fuentes, por lo quePrimero, necesita poner en cola múltiples fuentes; El
    árbol está dirigido por lo que no es necesario identificar si ha sido visitado, yPara gráficos no dirigidos, es necesario marcar si han sido visitados. ¡Y para evitar que un determinado nodo ingrese al equipo varias veces, debe configurarse como visitado antes de ingresar al equipo!
    Ideas de enlaces, autor: sweetiee

3.2. Búsqueda de fuentes:

  • Para árbol: el
    punto de origen es la raíz del árbol.
  • Para gráficos:
    el recorrido de los gráficos puede comenzar en cualquier punto, peroPara problemas de múltiples fuentes, primero recorra todos los vértices para descubrir que todos los puntos de origen se insertan en la cola.

4. Código C ++: El
código es para registrar sus propios pensamientos, y la complejidad del tiempo y la complejidad del espacio no son óptimas. Para obtener el código óptimo, consulte los dos enlaces anteriores.

class Solution {
    
    
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
    
    
        int row = matrix.size();
        int col = matrix[0].size();
        vector<vector<int>> res(row,vector<int>(col)); //记录结果
        vector<vector<int>> visited(row,vector<int>(col)); // 记录访问情况
        queue<pair<int,int>> q;
        for(int i = 0;i<row; i++){
    
     //首先查找所有源点
            for(int j = 0;j<col; j++){
    
    
                if(matrix[i][j] == 0){
    
                       
                    q.push(make_pair(i,j));
                    visited[i][j] = 1;
                }
            }
        }
        int val = 0; // 记录遍历层次
        while(!q.empty()){
    
    
            int size = q.size(); //记录每一层元素个数
            for(int i = 0;i<size;i++){
    
    
                pair<int, int> tmp = q.front();
                q.pop();
                res[tmp.first][tmp.second] = val;
                if(tmp.first-1>=0 && visited[tmp.first-1][tmp.second] == 0){
    
    
                    q.push(make_pair(tmp.first-1,tmp.second));
                    visited[tmp.first-1][tmp.second] = 1;
                }
                if(tmp.first+1<row && visited[tmp.first+1][tmp.second] == 0){
    
    
                    q.push(make_pair(tmp.first+1,tmp.second));
                    visited[tmp.first+1][tmp.second] = 1;
                }
                if(tmp.second-1>=0 && visited[tmp.first][tmp.second-1] == 0){
    
    
                    q.push(make_pair(tmp.first,tmp.second-1));
                    visited[tmp.first][tmp.second-1] = 1;
                }
                if(tmp.second+1<col && visited[tmp.first][tmp.second+1] == 0){
    
    
                    q.push(make_pair(tmp.first,tmp.second+1));
                    visited[tmp.first][tmp.second+1] = 1;
                }
            }
            val++;
        }
        return res;
    }
};

para resumir:

1. Encontrar la distancia es generalmente un problema de gráficas Piensa en la solución de gráficas.
2. La distancia más corta generalmente la resuelve BFS.
3. BFS de múltiples fuentes busca primero todos los puntos de origen.
4. Recuerde el método BFS anterior para determinar el nivel transversal actual.

Supongo que te gusta

Origin blog.csdn.net/qq_33726635/article/details/106452806
Recomendado
Clasificación