Find Maximum side length of square in a Matrix
Given a square matrix of odd order N. The task is to find the side-length of the largest square formed in the matrix. A square in matrix is said to be formed if all elements on its perimeter is same and its centre is centre of matrix. Centre of matrix is also a square with side length 1.
Examples:
Input : matrix[][] = {2, 3, 0,
0, 2, 0,
0, 1, 1}
Output : 1
Input : matrix[][] = {2, 2, 2,
2, 1, 2,
2, 2, 2}
Output : 3
The centre of any odd order matrix is element with index i = j = n/2. Now, for finding largest square in matrix, check all surrounding elements from centre which are at same distance. For a square which is i-unit away from centre check all the element which are in the n/2-i and n/2+i row and column also difference of n/2 and either of index of element does-not exceed i. Please find the format of a square with different possible side length in below example.
x x x x x
x y y y x
x y c y x
x y y y x
x x x x x
Points to care about :
- As centre element is also a form of square minimum possible side length is 1.
- Longest square can be with all elements present in 1st row and 1 column, hence maximum possible side-length is
Algorithm :
- Iterate over i=0 to n/2
- iterate over column i to n-i-1 for row i and n-i-1 both
and vice-versa and check whether all elements are same or not. - If yes then length of square is n-2*i.
- Else go for next iteration
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#define n 5
using namespace std;
int largestSideLen( int matrix[][n])
{
int result = 1;
for ( int i = 0; i < n / 2; i++) {
int element = matrix[i][i];
int isSquare = 1;
for ( int j = i; j < n - i; j++) {
if (matrix[i][j] != element)
isSquare = 0;
if (matrix[n - i - 1][j] != element)
isSquare = 0;
if (matrix[j][i] != element)
isSquare = 0;
if (matrix[j][n - i - 1] != element)
isSquare = 0;
}
if (isSquare)
return n - 2 * i;
}
return result;
}
int main()
{
int matrix[n][n] = { 1, 1, 1, 1, 1,
1, 2, 2, 2, 1,
1, 2, 1, 2, 1,
1, 2, 2, 2, 1,
1, 1, 1, 1, 1 };
cout << largestSideLen(matrix);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int n = 5 ;
static int largestSideLen( int matrix[][])
{
int result = 1 ;
for ( int i = 0 ; i < (n / 2 ); i++) {
int element = matrix[i][i];
int isSquare = 1 ;
for ( int j = i; j < n - i; j++) {
if (matrix[i][j] != element)
isSquare = 0 ;
if (matrix[n - i - 1 ][j] != element)
isSquare = 0 ;
if (matrix[j][i] != element)
isSquare = 0 ;
if (matrix[j][n - i - 1 ] != element)
isSquare = 0 ;
}
if (isSquare > 0 )
return n - ( 2 * i);
}
return result;
}
public static void main (String[] args) {
int matrix[][] = {{ 1 , 1 , 1 , 1 , 1 },
{ 1 , 2 , 2 , 2 , 1 },
{ 1 , 2 , 1 , 2 , 1 },
{ 1 , 2 , 2 , 2 , 1 },
{ 1 , 1 , 1 , 1 , 1 }};
System.out.println (largestSideLen(matrix));
}
}
|
Python3
n = 5
def largestSideLen(matrix):
result = 1
for i in range ( int (n / 2 )):
element = matrix[i][i]
isSquare = 1
for j in range (i, n - i):
if (matrix[i][j] ! = element):
isSquare = 0
if (matrix[n - i - 1 ][j] ! = element):
isSquare = 0
if (matrix[j][i] ! = element):
isSquare = 0
if (matrix[j][n - i - 1 ] ! = element):
isSquare = 0
if (isSquare):
return n - 2 * i
return result
if __name__ = = '__main__' :
matrix = [[ 1 , 1 , 1 , 1 , 1 ],
[ 1 , 2 , 2 , 2 , 1 ],
[ 1 , 2 , 1 , 2 , 1 ],
[ 1 , 2 , 2 , 2 , 1 ],
[ 1 , 1 , 1 , 1 , 1 ]]
print (largestSideLen(matrix))
|
C#
using System;
public class GFG{
static int n = 5;
static int largestSideLen( int [,]matrix)
{
int result = 1;
for ( int i = 0; i < (n / 2); i++) {
int element = matrix[i,i];
int isSquare = 1;
for ( int j = i; j < n - i; j++) {
if (matrix[i,j] != element)
isSquare = 0;
if (matrix[n - i - 1,j] != element)
isSquare = 0;
if (matrix[j,i] != element)
isSquare = 0;
if (matrix[j,n - i - 1] != element)
isSquare = 0;
}
if (isSquare > 0)
return n - (2 * i);
}
return result;
}
static public void Main (){
int [,]matrix = {{ 1, 1, 1, 1, 1},
{1, 2, 2, 2, 1},
{1, 2, 1, 2, 1},
{1, 2, 2, 2, 1},
{1, 1, 1, 1, 1 }};
Console.WriteLine(largestSideLen(matrix));
}
}
|
PHP
<?php
function largestSideLen( $matrix )
{
$n = 5;
$result = 1;
for ( $i = 0; $i < ( $n / 2); $i ++)
{
$element = $matrix [ $i ][ $i ];
$isSquare = 1;
for ( $j = $i ; $j < ( $n - $i ); $j ++)
{
if ( $matrix [ $i ][ $j ] != $element )
$isSquare = 0;
if ( $matrix [ $n - $i - 1][ $j ] != $element )
$isSquare = 0;
if ( $matrix [ $j ][ $i ] != $element )
$isSquare = 0;
if ( $matrix [ $j ][ $n - $i - 1] != $element )
$isSquare = 0;
}
if ( $isSquare )
return ( $n - 2 * $i );
}
return $result ;
}
$matrix = array ( 1, 1, 1, 1, 1,
1, 2, 2, 2, 1,
1, 2, 1, 2, 1,
1, 2, 2, 2, 1,
1, 1, 1, 1, 1 );
echo largestSideLen( $matrix );
?>
|
Javascript
<script>
const n = 5;
function largestSideLen(matrix)
{
let result = 1;
for (let i = 0; i < parseInt(n / 2); i++)
{
let element = matrix[i][i];
let isSquare = 1;
for (let j = i; j < n - i; j++) {
if (matrix[i][j] != element)
isSquare = 0;
if (matrix[n - i - 1][j] != element)
isSquare = 0;
if (matrix[j][i] != element)
isSquare = 0;
if (matrix[j][n - i - 1] != element)
isSquare = 0;
}
if (isSquare)
return n - 2 * i;
}
return result;
}
let matrix = [ [1, 1, 1, 1, 1],
[1, 2, 2, 2, 1],
[1, 2, 1, 2, 1],
[1, 2, 2, 2, 1],
[1, 1, 1, 1, 1 ]];
document.write(largestSideLen(matrix));
</script>
|
Last Updated :
03 Oct, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...