Minimice el conteo de pasos para hacer que todos los elementos de Matrix sean 0 al reemplazar los vecinos de K con 0

Dada una array de array 2-D [][] de tamaño M*N y un número entero K. Para cada aparición de K en la array[][] , reemplace K y todos los elementos adyacentes distintos de cero a su izquierda , derecha , arriba y abajo con 0 . El programa debe repetir el proceso hasta que todos los valores de la array sean cero. La tarea es encontrar el número mínimo de pasos requeridos para convertir la array dada [][] a 0. Si es imposible, imprima -1.

Nota: Un paso se define como elegir un índice con valor K y cambiar su valor a 0 junto con sus celdas adyacentes hasta que todas las celdas se conviertan en 0 o el índice salga del rango.

Ejemplos:

Entrada: M = 5, N = 5, 
array[5][5] = {{5, 6, 0, 5, 6}, 
{1, 8, 8, 0, 2}, 
{5, 5, 5, 0, 6}, 
{4, 5, 5, 5, 0}, 
{8, 8, 8, 8, 8}}, 
K = 6
Salida: 2
Explicación: la primera aparición de 6 se encuentra en matrix[0][ 1], por lo que todos los elementos adyacentes distintos de cero de izquierda, derecha, arriba y abajo se vuelven cero, es decir,
5 6                           0 0 
1 8 8 0 0 0
5 5 5 —> 0 0 0
4 5 5 5 0 0 0 0
8 8 8 8 8 0 0 0 0 
Entonces, después de realizar el proceso para la primera aparición de 6, la array se convierte en
0 0 0 5 6
0 0 0 0 2
0 0 0 0 6
0 0 0 0 0
0 0 0 0 0
La segunda aparición de 6 se encuentra en matrix[0][4], por lo que todos los elementos adyacentes distintos de cero de izquierda, derecha, arriba y abajo se vuelven cero después de realizar el proceso para la segunda ocurrencia de 6, la array se convierte en
0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0
0 0 0 0 
0 0 0 0
Ahora, todos los valores de celda en la array se vuelven cero. Por lo tanto, la salida es 2

Entrada: M = 4, N = 5, 
array[4][5] = {{5, 0, 0, 5, 6}, 
{1, 0, 8, 1, 0}, 
{0, 5, 0, 0, 6}, 
{4, 5, 0, 5, 2}}, 
K = 5
Salida: 4

 

Enfoque: la idea es atravesar la array en las cuatro direcciones izquierda, derecha, arriba y abajo , y al encontrar una celda con valor K, use la búsqueda en profundidad para cambiar el valor de todos los elementos adyacentes a 0. Siga los pasos a continuación . para resolver este problema:

  • Inicializar la variable interations_count a 0
  • Iterar sobre el rango [0, M) usando la fila variable y realizar las siguientes tareas:
    • Iterar sobre el rango [0, N) usando la variable col y realizar las siguientes tareas:
      • Si matrix[row][col] es igual a K, entonces realice DFS usando recursividad para cambiar todos los valores de los elementos posibles a 0 . También aumente el valor de iterations_count en 1.
  • Después de realizar los pasos anteriores, verifique si el valor de alguna celda es distinto de cero. En caso afirmativo, imprima -1, de lo contrario, imprima el valor de iterations_count como respuesta.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ code for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to implement DFS
void traverse(int M, int N, vector<vector<int> >& matrix,
              int row, int col)
{
 
    // Check the boundary conditions
    if (row >= 0 && row < M && col >= 0 && col < N) {
        if (matrix[row][col] == 0) {
            return;
        }
 
        // Change that non-zero
        // adjacent element to zero
        matrix[row][col] = 0;
 
        // Traverse the matrix in left
        traverse(M, N, matrix, row, col - 1);
 
        // Traverse the matrix in Right
        traverse(M, N, matrix, row, col + 1);
 
        // Traverse the matrix in Top
        traverse(M, N, matrix, row - 1, col);
 
        //// Traverse the matrix in Bottom
        traverse(M, N, matrix, row + 1, col);
    }
}
 
void findCount(int M, int N, vector<vector<int> >& matrix,
               int K)
{
 
    int iterations_count = 0;
 
    // Traverse the matrix and find any element
    // equals K, if any elements is found
    // increment the interations_count variable
    // and pass the element to the traverse function
    for (int row = 0; row < M; row++) {
        for (int col = 0; col < N; col++) {
            if (K == matrix[row][col]) {
                iterations_count++;
                traverse(M, N, matrix, row, col);
            }
        }
    }
 
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            if (matrix[i][j] != 0) {
                iterations_count = -1;
            }
        }
    }
 
    // Print the iterations count
    cout << iterations_count;
}
 
int main()
{
 
    // Initialize the values of M and N
    int M = 5, N = 5;
 
    // Assigning the elements of 5*5 matrix
    vector<vector<int> > matrix = { { 5, 6, 0, 5, 6 },
                                    { 1, 8, 8, 0, 2 },
                                    { 5, 5, 5, 0, 6 },
                                    { 4, 5, 5, 5, 0 },
                                    { 8, 8, 8, 8, 8 } };
 
    // Assign K as 6
    int K = 6;
 
    findCount(M, N, matrix, K);
    return 0;
}
 
// This code is contributed by Potta Lokesh

Java

// Java program for the above approach
public class GFG {
 
// Function to implement DFS
static void traverse(int M, int N,int matrix[][],int row, int col)
{
 
    // Check the boundary conditions
    if (row >= 0 && row < M
        && col >= 0 && col < N) {
        if (matrix[row][col] == 0) {
            return;
        }
 
        // Change that non-zero
        // adjacent element to zero
        matrix[row][col] = 0;
 
        // Traverse the matrix in left
        traverse(M, N, matrix, row, col - 1);
 
        // Traverse the matrix in Right
        traverse(M, N, matrix, row, col + 1);
 
        // Traverse the matrix in Top
        traverse(M, N, matrix, row - 1, col);
 
        //// Traverse the matrix in Bottom
        traverse(M, N, matrix, row + 1, col);
    }
}
 
static void findCount(int M, int N, int matrix[][],int K)
{
 
    int iterations_count = 0;
 
    // Traverse the matrix and find any element
    // equals K, if any elements is found
    // increment the interations_count variable
    // and pass the element to the traverse function
    for (int row = 0; row < M; row++) {
        for (int col = 0; col < N; col++) {
            if (K == matrix[row][col]) {
                iterations_count++;
                traverse(M, N, matrix, row, col);
            }
        }
    }
 
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            if (matrix[i][j] != 0) {
                iterations_count = -1;
            }
        }
    }
 
    // Print the iterations count
    System.out.print(iterations_count);
}
 
// Driver Code
public static void main(String []args)
{
 
    // Initialize the values of M and N
    int M = 5, N = 5;
 
    // Assigning the elements of 5*5 matrix
    int matrix[][] = {
            { 5, 6, 0, 5, 6 },
            { 1, 8, 8, 0, 2 },
            { 5, 5, 5, 0, 6 },
            { 4, 5, 5, 5, 0 },
            { 8, 8, 8, 8, 8 } };
 
    // Assign K as 6
    int K = 6;
 
    findCount(M, N, matrix, K);
 
}
 
}
 
// This code is contributed by AnkThon

Python3

# python program for the above approach
 
# Function to implement DFS
def traverse(M,  N, matrix, row, col):
 
    # Check the boundary conditions
    if (row >= 0 and row < M and col >= 0 and col < N):
        if (matrix[row][col] == 0):
            return
 
        # Change that non-zero
        # adjacent element to zero
        matrix[row][col] = 0
 
        # Traverse the matrix in left
        traverse(M, N, matrix, row, col - 1)
 
        # Traverse the matrix in Right
        traverse(M, N, matrix, row, col + 1)
 
        # Traverse the matrix in Top
        traverse(M, N, matrix, row - 1, col)
 
        # Traverse the matrix in Bottom
        traverse(M, N, matrix, row + 1, col)
 
 
def findCount(M, N, matrix, K):
    iterations_count = 0
 
    # Traverse the matrix and find any element
    # equals K, if any elements is found
    # increment the interations_count variable
    # and pass the element to the traverse function
    for row in range(0, M):
        for col in range(0, N):
            if (K == matrix[row][col]):
                iterations_count += 1
                traverse(M, N, matrix, row, col)
 
    for i in range(0, M):
        for j in range(0, N):
            if (matrix[i][j] != 0):
                iterations_count = -1
 
    # Print the iterations count
    print(iterations_count)
 
# Driver Code
if __name__ == "__main__":
 
    # Initialize the values of M and N
    M = 5
    N = 5
 
    # Assigning the elements of 5*5 matrix
    matrix = [[5, 6, 0, 5, 6],
              [1, 8, 8, 0, 2],
              [5, 5, 5, 0, 6],
              [4, 5, 5, 5, 0],
              [8, 8, 8, 8, 8]]
 
    # Assign K as 6
    K = 6
    findCount(M, N, matrix, K)
 
    # This code is contributed by rakeshsahni

C#

// C# program for the above approach
using System;
 
public class GFG {
 
    // Function to implement DFS
    static void traverse(int M, int N,int [,]matrix,int row, int col)
    {
     
        // Check the boundary conditions
        if (row >= 0 && row < M
            && col >= 0 && col < N) {
            if (matrix[row, col] == 0) {
                return;
            }
     
            // Change that non-zero
            // adjacent element to zero
            matrix[row, col] = 0;
     
            // Traverse the matrix in left
            traverse(M, N, matrix, row, col - 1);
     
            // Traverse the matrix in Right
            traverse(M, N, matrix, row, col + 1);
     
            // Traverse the matrix in Top
            traverse(M, N, matrix, row - 1, col);
     
            //// Traverse the matrix in Bottom
            traverse(M, N, matrix, row + 1, col);
        }
    }
     
    static void findCount(int M, int N, int [,]matrix,int K)
    {
     
        int iterations_count = 0;
     
        // Traverse the matrix and find any element
        // equals K, if any elements is found
        // increment the interations_count variable
        // and pass the element to the traverse function
        for (int row = 0; row < M; row++) {
            for (int col = 0; col < N; col++) {
                if (K == matrix[row, col]) {
                    iterations_count++;
                    traverse(M, N, matrix, row, col);
                }
            }
        }
     
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                if (matrix[i,j] != 0) {
                    iterations_count = -1;
                }
            }
        }
     
        // Print the iterations count
        Console.WriteLine(iterations_count);
    }
 
// Driver Code
public static void Main(String []args)
{
 
    // Initialize the values of M and N
    int M = 5, N = 5;
 
    // Assigning the elements of 5*5 matrix
    int [,]matrix = {
            { 5, 6, 0, 5, 6 },
            { 1, 8, 8, 0, 2 },
            { 5, 5, 5, 0, 6 },
            { 4, 5, 5, 5, 0 },
            { 8, 8, 8, 8, 8 } };
 
    // Assign K as 6
    int K = 6;
 
    findCount(M, N, matrix, K);
 
}
 
}
 
// This code is contributed by AnkThon

Javascript

<script>
// JavaScript program for the above approach
// Function to implement DFS
function traverse( M, N, matrix,
              row, col)
{
    // Check the boundary conditions
    if (row >= 0 && row < M
        && col >= 0 && col < N) {
        if (matrix[row][col] == 0) {
            return;
        }
 
        // Change that non-zero
        // adjacent element to zero
        matrix[row][col] = 0;
 
        // Traverse the matrix in left
        traverse(M, N, matrix, row, col - 1);
 
        // Traverse the matrix in Right
        traverse(M, N, matrix, row, col + 1);
 
        // Traverse the matrix in Top
        traverse(M, N, matrix, row - 1, col);
 
        //// Traverse the matrix in Bottom
        traverse(M, N, matrix, row + 1, col);
    }
}
 
function findCount(M, N,
                matrix,
                K)
{
 
    let iterations_count = 0;
 
    // Traverse the matrix and find any element
    // equals K, if any elements is found
    // increment the interations_count variable
    // and pass the element to the traverse function
    for (let row = 0; row < M; row++) {
        for (let col = 0; col < N; col++) {
            if (K == matrix[row][col]) {
                iterations_count++;
                traverse(M, N, matrix, row, col);
            }
        }
    }
 
    for (let i = 0; i < M; i++) {
        for (let j = 0; j < N; j++) {
            if (matrix[i][j] != 0) {
                iterations_count = -1;
            }
        }
    }
 
    // Print the iterations count
    document.write(iterations_count);
     
}
 
// Driver Code
 
    // Initialize the values of M and N
    let M = 5, N = 5;
 
    // Assigning the elements of 5*5 matrix
    let matrix
        = [[ 5, 6, 0, 5, 6 ],
            [ 1, 8, 8, 0, 2 ],
            [ 5, 5, 5, 0, 6 ],
            [ 4, 5, 5, 5, 0 ],
            [ 8, 8, 8, 8, 8]];
 
    // Assign K as 6
    let K = 6;
 
    findCount(M, N, matrix, K);
 
// This code is contributed by rohitsingh07052.
</script>
Producción

2

Complejidad temporal: O(M*N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por rumesh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *