logo

Verifique la simetría horizontal y vertical en una matriz binaria

Dada una matriz binaria 2D de norte filas y METRO columnas. La tarea es comprobar si la matriz es simétrica horizontal, simétrica vertical o ambas. Se dice que una matriz es simétrica horizontal si la primera fila es igual a la última fila, la segunda fila es igual a la penúltima fila y así sucesivamente. Y se dice que la matriz es simétrica vertical si la primera columna es igual a la última columna, la segunda columna es igual a la penúltima columna y así sucesivamente.

pruebas de software

Imprimir ' VERTICAL 'si la matriz es verticalmente simétrica' HORIZONTAL 'si la matriz es verticalmente simétrica' AMBOS ' si la matriz es simétrica vertical y horizontal y ' NO ' si no es simétrico.

Ejemplos:   



Aporte: norte = 3 m = 3
0 1 0
0 0 0
0 1 0
Producción: Ambos
Explicación: La primera y la tercera fila son iguales y la segunda fila también está en el medio. Entonces horizontalmente simétrico. De manera similar, la primera y la tercera columna son iguales y también la segunda columna está en el medio, por lo que es simétrica vertical.

Aporte: norte = 3 m = 3
0 0 1
1 1 0
0 0 1
Producción: Ambos 

Acercarse: La idea es utilizar punteros que indiquen dos filas (o columnas) y comparar cada celda de ambas filas (o columnas) puntiagudas. 

  • Para simetría horizontal, inicialice un puntero i = 0 y otro puntero j = N - 1. 
  • Ahora compare cada elemento de la i-ésima fila y la j-ésima fila. Aumente i en 1 y disminuya j en 1 en cada ciclo de bucle. 
    • Si se encuentra al menos un elemento que no es idéntico, marque la matriz como no simétrica horizontal.
  • De manera similar, para la simetría vertical, inicialice un puntero i = 0 y otro puntero j = M - 1. 
  • Ahora compare cada elemento de la i-ésima columna y la j-ésima columna. Aumente i en 1 y disminuya j en 1 en cada ciclo de bucle. 
    • Si se encuentra al menos un elemento que no es idéntico, marque la matriz como no simétrica vertical.

A continuación se muestra la implementación de la idea anterior: 

C++
// C++ program to find if a matrix is symmetric. #include    #define MAX 1000 using namespace std; void checkHV(int arr[][MAX] int N int M) {  // Initializing as both horizontal and vertical  // symmetric.  bool horizontal = true vertical = true;  // Checking for Horizontal Symmetry. We compare  // first row with last row second row with second  // last row and so on.  for (int i = 0 k = N - 1; i < N / 2; i++ k--) {  // Checking each cell of a column.  for (int j = 0; j < M; j++) {  // check if every cell is identical  if (arr[i][j] != arr[k][j]) {  horizontal = false;  break;  }  }  }  // Checking for Vertical Symmetry. We compare  // first column with last column second column  // with second last column and so on.  for (int j = 0 k = M - 1; j < M / 2; j++ k--) {  // Checking each cell of a row.  for (int i = 0; i < N; i++) {  // check if every cell is identical  if (arr[i][j] != arr[i][k]) {  vertical = false;  break;  }  }  }  if (!horizontal && !vertical)  cout << 'NOn';  else if (horizontal && !vertical)  cout << 'HORIZONTALn';  else if (vertical && !horizontal)  cout << 'VERTICALn';  else  cout << 'BOTHn'; } // Driven Program int main() {  int mat[MAX][MAX]  = { { 0 1 0 } { 0 0 0 } { 0 1 0 } };  checkHV(mat 3 3);  return 0; } 
Java
// Java program to find if // a matrix is symmetric. import java.io.*; public class GFG {  static void checkHV(int[][] arr int N int M)  {  // Initializing as both horizontal  // and vertical symmetric.  boolean horizontal = true;  boolean vertical = true;  // Checking for Horizontal Symmetry.  // We compare first row with last  // row second row with second  // last row and so on.  for (int i = 0 k = N - 1; i < N / 2; i++ k--) {  // Checking each cell of a column.  for (int j = 0; j < M; j++) {  // check if every cell is identical  if (arr[i][j] != arr[k][j]) {  horizontal = false;  break;  }  }  }  // Checking for Vertical Symmetry. We compare  // first column with last column second column  // with second last column and so on.  for (int j = 0 k = M - 1; j < M / 2; j++ k--) {  // Checking each cell of a row.  for (int i = 0; i < N; i++) {  // check if every cell is identical  if (arr[i][j] != arr[i][k]) {  horizontal = false;  break;  }  }  }  if (!horizontal && !vertical)  System.out.println('NO');  else if (horizontal && !vertical)  System.out.println('HORIZONTAL');  else if (vertical && !horizontal)  System.out.println('VERTICAL');  else  System.out.println('BOTH');  }  // Driver Code  static public void main(String[] args)  {  int[][] mat  = { { 1 0 1 } { 0 0 0 } { 1 0 1 } };  checkHV(mat 3 3);  } } // This code is contributed by vt_m. 
Python3
# Python3 program to find if a matrix is symmetric. MAX = 1000 def checkHV(arr N M): # Initializing as both horizontal and vertical # symmetric. horizontal = True vertical = True # Checking for Horizontal Symmetry. We compare # first row with last row second row with second # last row and so on. i = 0 k = N - 1 while(i < N // 2): # Checking each cell of a column. for j in range(M): # check if every cell is identical if (arr[i][j] != arr[k][j]): horizontal = False break i += 1 k -= 1 # Checking for Vertical Symmetry. We compare # first column with last column second column # with second last column and so on. i = 0 k = M - 1 while(j < M // 2): # Checking each cell of a row. for i in range(N): # check if every cell is identical if (arr[i][j] != arr[i][k]): vertical = False break j += 1 k -= 1 if (not horizontal and not vertical): print('NO') elif (horizontal and not vertical): print('HORIZONTAL') elif (vertical and not horizontal): print('VERTICAL') else: print('BOTH') # Driver code mat = [[1 0 1] [0 0 0] [1 0 1]] checkHV(mat 3 3) # This code is contributed by shubhamsingh10 
C#
// C# program to find if // a matrix is symmetric. using System; public class GFG {  static void checkHV(int[ ] arr int N int M)  {  // Initializing as both horizontal  // and vertical symmetric.  bool horizontal = true;  bool vertical = true;  // Checking for Horizontal Symmetry.  // We compare first row with last  // row second row with second  // last row and so on.  for (int j = 0 k = N - 1; j < N / 2; j++ k--) {  // Checking each cell of a column.  for (int i = 0; i < M; i++) {  // check if every cell is identical  if (arr[i j] != arr[i k]) {  horizontal = false;  break;  }  }  }  // Checking for Vertical Symmetry. We compare  // first column with last column second column  // with second last column and so on.  for (int i = 0 k = M - 1; i < M / 2; i++ k--) {  // Checking each cell of a row.  for (int j = 0; j < N; j++) {  // check if every cell is identical  if (arr[i j] != arr[k j]) {  horizontal = false;  break;  }  }  }  if (!horizontal && !vertical)  Console.WriteLine('NO');  else if (horizontal && !vertical)  Console.WriteLine('HORIZONTAL');  else if (vertical && !horizontal)  Console.WriteLine('VERTICAL');  else  Console.WriteLine('BOTH');  }  // Driver Code  static public void Main()  {  int[ ] mat  = { { 1 0 1 } { 0 0 0 } { 1 0 1 } };  checkHV(mat 3 3);  } } // This code is contributed by vt_m. 
PHP
 // PHP program to find if  // a matrix is symmetric. function checkHV($arr $N $M) { // Initializing as both horizontal  // and vertical symmetric. $horizontal = true; $vertical = true; // Checking for Horizontal Symmetry.  // We compare first row with last row // second row with second last row  // and so on. for ($i = 0 $k = $N - 1; $i < $N / 2; $i++ $k--) { // Checking each cell of a column. for ($j = 0; $j < $M; $j++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$k][$j]) { $horizontal = false; break; } } } // Checking for Vertical Symmetry.  // We compare first column with  // last column second column with  // second last column and so on. for ($j = 0 $k = $M - 1; $j < $M / 2; $j++ $k--) { // Checking each cell of a row. for ($i = 0; $i < $N; $i++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$i][$k]) { $horizontal = false; break; } } } if (!$horizontal && !$vertical) echo 'NOn'; else if ($horizontal && !$vertical) cout << 'HORIZONTALn'; else if ($vertical && !$horizontal) echo 'VERTICALn'; else echo 'BOTHn'; } // Driver Code $mat = array(array (1 0 1) array (0 0 0) array (1 0 1)); checkHV($mat 3 3); // This code is contributed by nitin mittal.  ?> 
JavaScript
<script>  // Javascript program to find if  // a matrix is symmetric.    function checkHV(arr N M)  {    // Initializing as both horizontal  // and vertical symmetric.  let horizontal = true;  let vertical = true;    // Checking for Horizontal Symmetry.  // We compare first row with last  // row second row with second  // last row and so on.  for (let i = 0 k = N - 1;  i < parseInt(N / 2 10); i++ k--) {    // Checking each cell of a column.  for (let j = 0; j < M; j++) {  // check if every cell is identical  if (arr[i][j] != arr[k][j]) {  horizontal = false;  break;  }  }  }    // Checking for Vertical Symmetry. We compare  // first column with last column second column  // with second last column and so on.  for (let j = 0 k = M - 1;  j < parseInt(M / 2 10); j++ k--) {    // Checking each cell of a row.  for (let i = 0; i < N; i++) {  // check if every cell is identical  if (arr[i][j] != arr[i][k]) {  horizontal = false;  break;  }  }  }    if (!horizontal && !vertical)  document.write('NO');    else if (horizontal && !vertical)  document.write('HORIZONTAL');    else if (vertical && !horizontal)  document.write('VERTICAL');    else  document.write('BOTH');  }    let mat = [ [ 1 0 1 ]  [ 0 0 0 ]  [ 1 0 1 ] ];    checkHV(mat 3 3);   </script> 

Producción
BOTH

Complejidad del tiempo: O(N*M).
Espacio Auxiliar: O(1)


Crear cuestionario