Cuente el número de asignaciones en una array binaria dada en función de las condiciones dadas

Dada una array binaria de tamaño M*N que contiene solo 0 y 1 . La tarea es contar el número de asignaciones en la array. Hay un mapeo entre dos 1 s cualesquiera si se cumplen las siguientes condiciones:

  • Los dos 1 están ubicados en dos filas diferentes: r1 y r2 , donde r1 < r2 .
  • Para cada fila i donde r1 < i < r2 , no hay 1 en la i-ésima fila.

Ejemplos: 

Entrada: array[][] = { {0, 1, 1, 0, 0, 1}, 
                                {0, 0, 0, 0, 0, 0}, 
                                {0, 1, 0, 1, 0, 0} , 
                                {0, 0, 1, 0, 0, 0} };
Salida: 8
Explicación: Entre cada uno de los siguientes 1, hay una asignación. En total, hay 8 asignaciones:
array[0][1] -> array[2][1]
array[0][1] -> array[2][3]
array[0][2] -> array [2][1]
array[0][2] -> array[2][3]
array[0][5] -> array[2][1]
array[0][5] -> array[2 ][3]
array[2][1] -> array[3][2]
array[2][3] -> array[3][2]
Tenga en cuenta que no hay asignación entre ningún 1 en la fila 0 con cualquiera en la 3ra fila.
Esto se debe a que la segunda fila contiene 1, lo que rompe la segunda condición.

Entrada: array = { {0, 0, 0}, 
                            {1, 1, 1}, 
                            {0, 0, 0} };
Salida: 0
Explicación: No existen dos 1 ubicados en dos filas diferentes.

 

Enfoque: La idea es atravesar cada fila y contar el número de 1 s en ella. Recorra las filas subsiguientes y deténgase cuando la primera fila siguiente contenga al menos un 1 . Calcule el número de asignaciones entre estas dos filas y agréguelas a la variable de suma . Nuevamente, repita este proceso haciendo que la última fila sea el punto de referencia inicial. Siga los pasos a continuación para resolver el problema dado.

  • Considere la primera fila como la fila anterior y cuente los 1 en ella, es decir, prev = recuento de 1 en la primera fila.
  • Cuente 1 s en las filas subsiguientes y deténgase cuando una fila tenga al menos un 1 , es decir, siguiente = conteo de 1 en la fila subsiguiente.
  • Calcule las asignaciones entre la fila anterior y la siguiente, es decir , maps = anterior * siguiente
  • Agregue el número de nuevas asignaciones en la variable de suma, es decir, res += mapas.
  • Haga la siguiente fila como la anterior y repita el ciclo de encontrar la siguiente fila.
  • Finalmente, imprima el número de asignaciones totales .

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

C++

// C++ program for above approach
#include <iostream>
#include <vector>
using namespace std;
 
// Function to count the number of mappings
int CountNumberOfMappings(vector<vector<int> >& matrix)
{
    int i, j, prev = 0, m = matrix.size(),
              n = matrix[0].size();
 
    // Count 1s in first row.
    for (i = 0; i < n; i++) {
        if (matrix[0][i] == 1)
            prev += 1;
    }
 
    // Count 1s in subsequent rows.
    int next = 0, res = 0;
    for (j = 1; j < m; j++) {
        next = 0;
        for (i = 0; i < n; i++) {
            if (matrix[j][i] == 1)
                next += 1;
        }
 
        // Stop when a row has
        // atleast one 1 in it.
        if (next > 0) {
            // Compute number of mappings
            // between prev and next rows.
            res += prev * next;
 
            // Add these mappings to
            // result variable.
            prev = next;
        }
    }
 
    // Return total number of mappings.
    return res;
}
 
// Driver Code
int main()
{
 
    vector<vector<int> > matrix{ { 0, 1, 1, 0, 0, 1 },
                                 { 0, 0, 0, 0, 0, 0 },
                                 { 0, 1, 0, 1, 0, 0 },
                                 { 0, 0, 1, 0, 0, 0 } };
 
    int res = CountNumberOfMappings(matrix);
    cout << res;
    return 0;
}

Java

/*package whatever //do not write package name here */
import java.io.*;
class GFG {
 
  // Function to count the number of mappings
  static int CountNumberOfMappings(int[][] matrix)
  {
    int i, j, prev = 0, m = matrix.length,
    n = matrix[0].length;
 
    // Count 1s in first row.
    for (i = 0; i < n; i++) {
      if (matrix[0][i] == 1)
        prev += 1;
    }
 
    // Count 1s in subsequent rows.
    int next = 0, res = 0;
    for (j = 1; j < m; j++) {
      next = 0;
      for (i = 0; i < n; i++) {
        if (matrix[j][i] == 1)
          next += 1;
      }
 
      // Stop when a row has
      // atleast one 1 in it.
      if (next > 0)
      {
 
        // Compute number of mappings
        // between prev and next rows.
        res += prev * next;
 
        // Add these mappings to
        // result variable.
        prev = next;
      }
    }
 
    // Return total number of mappings.
    return res;
  }
 
  // Driver Code
  public static void main (String[] args) {
    int[][] matrix = { { 0, 1, 1, 0, 0, 1 },
                      { 0, 0, 0, 0, 0, 0 },
                      { 0, 1, 0, 1, 0, 0 },
                      { 0, 0, 1, 0, 0, 0 } };
 
    int res = CountNumberOfMappings(matrix);
    System.out.print(res);
  }
}
 
// This code is contributed by hrithikgarg03188

Python3

# Python code for the above approach
 
# Function to count the number of mappings
def CountNumberOfMappings(matrix):
    prev = 0
    m = len(matrix)
    n = len(matrix[0])
 
    # Count 1s in first row.
    for i in range(n):
        if (matrix[0][i] == 1):
            prev += 1
 
    # Count 1s in subsequent rows.
    next = 0
    res = 0
    for j in range(1, m):
        next = 0
        for i in range(n):
            if (matrix[j][i] == 1):
                next += 1
 
        # Stop when a row has
        # atleast one 1 in it.
        if (next > 0):
            # Compute number of mappings
            # between prev and next rows.
            res += prev * next
 
            # Add these mappings to
            # result variable.
            prev = next
 
    # Return total number of mappings.
    return res
 
# Driver Code
matrix = [[0, 1, 1, 0, 0, 1],
          [0, 0, 0, 0, 0, 0],
          [0, 1, 0, 1, 0, 0],
          [0, 0, 1, 0, 0, 0]]
 
res = CountNumberOfMappings(matrix)
print(res)
 
# This code is contributed by gfgking

C#

// C# program for above approach
using System;
class GFG
{
 
  // Function to count the number of mappings
  static int CountNumberOfMappings(int[, ] matrix)
  {
    int prev = 0;
    int m = matrix.GetLength(0), n
      = matrix.GetLength(1);
 
    // Count 1s in first row.
    for (int i = 0; i < n; i++) {
      if (matrix[0, i] == 1)
        prev += 1;
    }
 
    // Count 1s in subsequent rows.
    int next = 0, res = 0;
    for (int j = 1; j < m; j++) {
      next = 0;
      for (int i = 0; i < n; i++) {
        if (matrix[j, i] == 1)
          next += 1;
      }
 
      // Stop when a row has
      // atleast one 1 in it.
      if (next > 0) {
        // Compute number of mappings
        // between prev and next rows.
        res += prev * next;
 
        // Add these mappings to
        // result variable.
        prev = next;
      }
    }
 
    // Return total number of mappings.
    return res;
  }
 
  // Driver Code
  public static void Main()
  {
 
    int[, ] matrix = { { 0, 1, 1, 0, 0, 1 },
                      { 0, 0, 0, 0, 0, 0 },
                      { 0, 1, 0, 1, 0, 0 },
                      { 0, 0, 1, 0, 0, 0 } };
 
    int res = CountNumberOfMappings(matrix);
    Console.Write(res);
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
      // JavaScript code for the above approach
 
 
      // Function to count the number of mappings
      function CountNumberOfMappings(matrix) {
          let i, j, prev = 0, m = matrix.length,
              n = matrix[0].length;
 
          // Count 1s in first row.
          for (i = 0; i < n; i++) {
              if (matrix[0][i] == 1)
                  prev += 1;
          }
 
          // Count 1s in subsequent rows.
          let next = 0, res = 0;
          for (j = 1; j < m; j++) {
              next = 0;
              for (i = 0; i < n; i++) {
                  if (matrix[j][i] == 1)
                      next += 1;
              }
 
              // Stop when a row has
              // atleast one 1 in it.
              if (next > 0) {
                  // Compute number of mappings
                  // between prev and next rows.
                  res += prev * next;
 
                  // Add these mappings to
                  // result variable.
                  prev = next;
              }
          }
 
          // Return total number of mappings.
          return res;
      }
 
      // Driver Code
 
 
      let matrix = [[0, 1, 1, 0, 0, 1],
      [0, 0, 0, 0, 0, 0],
      [0, 1, 0, 1, 0, 0],
      [0, 0, 1, 0, 0, 0]];
 
      let res = CountNumberOfMappings(matrix);
      document.write(res);
 
     // This code is contributed by Potta Lokesh
  </script>
Producción: 

8

 

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

Publicación traducida automáticamente

Artículo escrito por pintusaini 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 *