Check horizontal and vertical symmetry in binary matrix

13 Jun, 2022
Given a 2D binary matrix of N rows and M columns. The task is to check whether the matrix is horizontal symmetric, vertical symmetric, or both. The matrix is said to be horizontal symmetric if the first row is the same as the last row, the second row is the same as the second last row, and so on. And the matrix is said to be vertical symmetric if the first column is the same as the last column, the second column is the same as the second last column, and so on. Print “VERTICAL” if the matrix is vertically symmetric, “HORIZONTAL” if the matrix is vertically symmetric, “BOTH” if the matrix is vertical and horizontal symmetric, and “NO” if not symmetric.
Examples:  
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 
The idea is to use pointers indicating two rows (or columns) and compare each cell of both the pointed rows (or columns). For Horizontal Symmetry, initialize one pointer i = 0 and another pointer j = N – 1. Now, compare each element of i-th row and j-th row. Increase i by 1 and decrease j by 1 in each loop cycle. If at least one, not an identical element, is found, mark the matrix as not horizontal symmetric.Similarly, for Vertical Symmetry, initialize one pointer i = 0 and another pointer j = M – 1. Now, compare each element of i-th column and j-th column. Increase i by 1 and decrease j by 1 in each loop cycle. If at least one, not an identical element, is found, mark the matrix as not vertical symmetric.
Below is the implementation of the above idea: 
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find if a matrix is symmetric.#include <bits/stdc++.h>#define MAX 1000using 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 Programint main(){    int mat[MAX][MAX] = { { 1, 0, 1 },                          { 0, 0, 0 },                          { 1, 0, 1 } };     checkHV(mat, 3, 3);     return 0;}
// 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 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 codemat = [[1, 0, 1],[ 0, 0, 0],[1, 0, 1]] checkHV(mat, 3, 3) # This code is contributed by shubhamsingh10
// 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 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.?>
<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>
Output:  
BOTH
Time Complexity: O(N*M).Auxiliary Space: O(1)This article is contributed by Aarti_Rathi and Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
vt_m
nitin mittal
ADITYAGUPTA25
SHUBHAMSINGH10
mukesh07
as5853535
simmytarika5
codewithmini
Matrix
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.