Comprobar simetría horizontal y vertical en array binaria

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

Deja una respuesta

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