Dada una array binaria 2D de N filas y M columnas. La tarea es verificar si la array es simétrica horizontal, simétrica vertical o ambas. Se dice que la array es simétrica horizontalmente 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 array es simétrica verticalmente si la primera columna es igual a la última columna, la segunda columna es igual a la penúltima columna, y así sucesivamente. Escriba «VERTICAL» si la array es simétrica verticalmente, «HORIZONTAL» si la array es simétrica verticalmente, «AMBOS» si la array es simétrica vertical y horizontal, y «NO» si no es simétrica.
Ejemplos:
Input: N = 3 M = 3 0 1 0 0 0 0 0 1 0 Output: Both First and third row are same and also second row is in middle. So Horizontal Symmetric. Similarly, First and third column are same and also second column is in middle, so Vertical Symmetric. Input: 0 0 1 1 1 0 0 0 1. Output: Both
La idea es usar punteros que indiquen dos filas (o columnas) y comparar cada celda de ambas filas (o columnas) señaladas.
Para la 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 uno, no un elemento idéntico, marque la array 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 uno, no un elemento idéntico, marque la array 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 <bits/stdc++.h> #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 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]) { vertical = false; break; } } } if (!horizontal && !vertical) cout << "NO\n"; else if (horizontal && !vertical) cout << "HORIZONTAL\n"; else if (vertical && !horizontal) cout << "VERTICAL\n"; else cout << "BOTH\n"; } // Driven Program int main() { int mat[MAX][MAX] = { { 1, 0, 1 }, { 0, 0, 0 }, { 1, 0, 1 } }; 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 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) 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(i < M // 2): # Checking each cell of a row. for j in range(N): # check if every cell is identical if (arr[i][j] != arr[k][j]): vertical = False break i += 1 k -= 1 if (not horizontal and not vertical): print("NO") else if (horizontal and not vertical): print("HORIZONTAL") else if (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 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 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 // 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 ($i = 0, $k = $M - 1; $i < $M / 2; $i++, $k--) { // Checking each cell of a row. for ($j = 0; $j < $N; $j++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$k][$j]) { $horizontal = false; break; } } } if (!$horizontal && !$vertical) echo "NO\n"; else if ($horizontal && !$vertical) cout << "HORIZONTAL\n"; else if ($vertical && !$horizontal) echo "VERTICAL\n"; else echo "BOTH\n"; } // 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 i = 0, k = M - 1; i < parseInt(M / 2, 10); i++, k--) { // Checking each cell of a row. for (let j = 0; j < N; j++) { // check if every cell is identical if (arr[i][j] != arr[k][j]) { 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 temporal: O(N*M).
Espacio auxiliar: O(1)
Este artículo es una contribución de Aarti_Rathi y Anuj Chauhan . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA