Check horizontal and vertical symmetry in binary matrix
Last Updated :
12 Sep, 2023
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
Explanation: 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: N = 3 M = 3
0 0 1
1 1 0
0 0 1
Output: Both
Approach: 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++
#include <bits/stdc++.h>
#define MAX 1000
using namespace std;
void checkHV( int arr[][MAX], int N, int M)
{
bool horizontal = true , vertical = true ;
for ( int i = 0, k = N - 1; i < N / 2; i++, k--) {
for ( int j = 0; j < M; j++) {
if (arr[i][j] != arr[k][j]) {
horizontal = false ;
break ;
}
}
}
for ( int j = 0, k = M - 1; j < M / 2; j++, k--) {
for ( int i = 0; i < N; i++) {
if (arr[i][j] != arr[i][k]) {
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" ;
}
int main()
{
int mat[MAX][MAX]
= { { 0, 1, 0 }, { 0, 0, 0 }, { 0, 1, 0 } };
checkHV(mat, 3, 3);
return 0;
}
|
Java
import java.io.*;
public class GFG {
static void checkHV( int [][] arr, int N, int M)
{
boolean horizontal = true ;
boolean vertical = true ;
for ( int i = 0 , k = N - 1 ; i < N / 2 ; i++, k--) {
for ( int j = 0 ; j < M; j++) {
if (arr[i][j] != arr[k][j]) {
horizontal = false ;
break ;
}
}
}
for ( int j = 0 , k = M - 1 ; j < M / 2 ; j++, k--) {
for ( int i = 0 ; i < N; i++) {
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" );
}
static public void main(String[] args)
{
int [][] mat
= { { 1 , 0 , 1 }, { 0 , 0 , 0 }, { 1 , 0 , 1 } };
checkHV(mat, 3 , 3 );
}
}
|
Python3
MAX = 1000
def checkHV(arr, N, M):
horizontal = True
vertical = True
i = 0
k = N - 1
while (i < N / / 2 ):
for j in range (M):
if (arr[i][j] ! = arr[k][j]):
horizontal = False
break
i + = 1
k - = 1
i = 0
k = M - 1
while (j < M / / 2 ):
for i in range (N):
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" )
mat = [[ 1 , 0 , 1 ], [ 0 , 0 , 0 ], [ 1 , 0 , 1 ]]
checkHV(mat, 3 , 3 )
|
C#
using System;
public class GFG {
static void checkHV( int [, ] arr, int N, int M)
{
bool horizontal = true ;
bool vertical = true ;
for ( int j = 0, k = N - 1; j < N / 2; j++, k--) {
for ( int i = 0; i < M; i++) {
if (arr[i, j] != arr[i, k]) {
horizontal = false ;
break ;
}
}
}
for ( int i = 0, k = M - 1; i < M / 2; i++, k--) {
for ( int j = 0; j < N; j++) {
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" );
}
static public void Main()
{
int [, ] mat
= { { 1, 0, 1 }, { 0, 0, 0 }, { 1, 0, 1 } };
checkHV(mat, 3, 3);
}
}
|
PHP
<?php
function checkHV( $arr , $N , $M )
{
$horizontal = true; $vertical = true;
for ( $i = 0, $k = $N - 1;
$i < $N / 2; $i ++,
$k --)
{
for ( $j = 0; $j < $M ; $j ++)
{
if ( $arr [ $i ][ $j ] != $arr [ $k ][ $j ])
{
$horizontal = false;
break ;
}
}
}
for ( $j = 0, $k = $M - 1;
$j < $M / 2; $j ++,
$k --)
{
for ( $i = 0; $i < $N ; $i ++)
{
if ( $arr [ $i ][ $j ] != $arr [ $i ][ $k ])
{
$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" ;
}
$mat = array ( array (1, 0, 1),
array (0, 0, 0),
array (1, 0, 1));
checkHV( $mat , 3, 3);
?>
|
Javascript
<script>
function checkHV(arr, N, M)
{
let horizontal = true ;
let vertical = true ;
for (let i = 0, k = N - 1;
i < parseInt(N / 2, 10); i++, k--) {
for (let j = 0; j < M; j++) {
if (arr[i][j] != arr[k][j]) {
horizontal = false ;
break ;
}
}
}
for (let j = 0, k = M - 1;
j < parseInt(M / 2, 10); j++, k--) {
for (let i = 0; i < N; i++) {
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>
|
Time Complexity: O(N*M).
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...