Check if matrix A can be converted to B by changing parity of corner elements of any submatrix
Given two binary matrices, A[][] and B[][] of N×M. In a single operation, one can choose a sub-matrix (min of 2 rows and 2c columns) and change the parity of the corner elements i.e. 1 can be changed to a 0, and 0 can be changed to a 1. The task is to check if matrix A can be converted to B using any number of operations.
Examples:
Input: A[][] = {{0, 1, 0}, {0, 1, 0}, {1, 0, 0}},
B[][] = {{1, 0, 0}, {1, 0, 0}, {1, 0, 0}}
Output: Yes
Choose the sub-matrix whose top-left corner is (0, 0)
and bottom-right corner is (1, 1).
Changing the parity of the corner elements
of this sub-matrix will convert A[][] to B[][]
Input: A[][] = {{0, 1, 0, 1}, {1, 0, 1, 0}, {0, 1, 0, 1}},
B[][] = {{1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}}
Output: No
Approach: The first thing to notice is that despite the conversions the total parity of both the matrix will remain the same. Hence, check if a[i][j] is not same as b[i][j] then change the parity of the corner elements of the sub-matrix whose left top corner is (0, 0) and right bottom corner is (i, j) for 1 ? i, j. After performing parity change for every a[i][j] which is not equal to b[i][j], check if both the matrix are the same or not. If they are the same, we can change A to B.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define N 3
#define M 3
bool check( int a[N][M], int b[N][M])
{
for ( int i = 1; i < N; i++) {
for ( int j = 1; j < M; j++) {
if (a[i][j] != b[i][j]) {
a[i][j] ^= 1;
a[0][0] ^= 1;
a[0][j] ^= 1;
a[i][0] ^= 1;
}
}
}
for ( int i = 0; i < N; i++) {
for ( int j = 0; j < M; j++) {
if (a[i][j] != b[i][j])
return false ;
}
}
return true ;
}
int main()
{
int a[N][N] = { { 0, 1, 0 },
{ 0, 1, 0 },
{ 1, 0, 0 } };
int b[N][N] = { { 1, 0, 0 },
{ 1, 0, 0 },
{ 1, 0, 0 } };
if (check(a, b))
cout << "Yes" ;
else
cout << "No" ;
}
|
Java
import java.io.*;
public class GFG {
static final int N = 3 , M = 3 ;
static boolean check( int a[][], int b[][])
{
for ( int i = 1 ; i < N; i++) {
for ( int j = 1 ; j < M; j++) {
if (a[i][j] != b[i][j]) {
a[i][j] ^= 1 ;
a[ 0 ][ 0 ] ^= 1 ;
a[ 0 ][j] ^= 1 ;
a[i][ 0 ] ^= 1 ;
}
}
}
for ( int i = 0 ; i < N; i++) {
for ( int j = 0 ; j < M; j++) {
if (a[i][j] != b[i][j])
return false ;
}
}
return true ;
}
public static void main(String args[])
{
int a[][]
= { { 0 , 1 , 0 }, { 0 , 1 , 0 }, { 1 , 0 , 0 } };
int b[][]
= { { 1 , 0 , 0 }, { 1 , 0 , 0 }, { 1 , 0 , 0 } };
if (check(a, b))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
N = 3
M = 3
def check(a, b):
for i in range ( 1 , N, 1 ):
for j in range ( 1 , M, 1 ):
if (a[i][j] ! = b[i][j]):
a[i][j] ^ = 1
a[ 0 ][ 0 ] ^ = 1
a[ 0 ][j] ^ = 1
a[i][ 0 ] ^ = 1
for i in range (N):
for j in range (M):
if (a[i][j] ! = b[i][j]):
return False
return True
if __name__ = = '__main__' :
a = [[ 0 , 1 , 0 ],
[ 0 , 1 , 0 ],
[ 1 , 0 , 0 ]]
b = [[ 1 , 0 , 0 ],
[ 1 , 0 , 0 ],
[ 1 , 0 , 0 ]]
if (check(a, b)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static readonly int N = 3,M =3;
static bool check( int [,]a, int [,]b)
{
for ( int i = 1; i < N; i++)
{
for ( int j = 1; j < M; j++)
{
if (a[i,j] != b[i,j])
{
a[i,j] ^= 1;
a[0,0] ^= 1;
a[0,j] ^= 1;
a[i,0] ^= 1;
}
}
}
for ( int i = 0; i < N; i++)
{
for ( int j = 0; j < M; j++)
{
if (a[i,j] != b[i,j])
return false ;
}
}
return true ;
}
public static void Main(String []args)
{
int [,]a = { { 0, 1, 0 },
{ 0, 1, 0 },
{ 1, 0, 0 } };
int [,]b = { { 1, 0, 0 },
{ 1, 0, 0 },
{ 1, 0, 0 } };
if (check(a, b))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
PHP
<?php
$N = 3;
$M = 3 ;
function check( $a , $b )
{
for ( $i = 1; $i < $GLOBALS [ 'N' ]; $i ++)
{
for ( $j = 1; $j < $GLOBALS [ 'M' ]; $j ++)
{
if ( $a [ $i ][ $j ] != $b [ $i ][ $j ])
{
$a [ $i ][ $j ] ^= 1;
$a [0][0] ^= 1;
$a [0][ $j ] ^= 1;
$a [ $i ][0] ^= 1;
}
}
}
for ( $i = 0; $i < $GLOBALS [ 'N' ]; $i ++)
{
for ( $j = 0; $j < $GLOBALS [ 'M' ]; $j ++)
{
if ( $a [ $i ][ $j ] != $b [ $i ][ $j ])
return false;
}
}
return true;
}
$a = array ( array ( 0, 1, 0 ),
array ( 0, 1, 0 ),
array ( 1, 0, 0 ) );
$b = array ( array ( 1, 0, 0 ),
array (1, 0, 0 ),
array ( 1, 0, 0 ) );
if (check( $a , $b ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
var N = 3, M = 3;
function check(a , b) {
for (i = 1; i < N; i++) {
for (j = 1; j < M; j++) {
if (a[i][j] != b[i][j]) {
a[i][j] ^= 1;
a[0][0] ^= 1;
a[0][j] ^= 1;
a[i][0] ^= 1;
}
}
}
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
if (a[i][j] != b[i][j])
return false ;
}
}
return true ;
}
var a = [ [ 0, 1, 0 ],
[ 0, 1, 0 ],
[ 1, 0, 0 ] ];
var b = [ [ 1, 0, 0 ],
[ 1, 0, 0 ],
[ 1, 0, 0 ] ];
if (check(a, b))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(N * M)
Auxiliary Space: O(1)
Last Updated :
08 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...