×

String Coding Problems

Arrays Coding Problems

Sorting Coding Problems

Searching Coding Problems

Coding Algorithms

Tree Coding Problems

Stack Coding Problems

Linked list Coding Problems

Graph Coding Problems

Greedy Algorithms Coding Problems

Dynamic Programming Coding Problems

Matrix Coding Problems

Recursion Coding Problems

Number Theory Coding Problems

Backtracking Coding Problems

Heap Coding Problems

Brute Force Coding Problems

Implementation Coding Problems

Google Contests

Competitive Programming Coding

Miscellaneous

Largest Square Sub Matrix of 1's in Given Binary Matrix

Given a N*M binary matrix find the size of largest square sub-matrix of 1's present in it.
Submitted by Divyansh Jaipuriyar, on September 03, 2020

Problem statement

Given a N*M binary matrix find the size of largest square sub-matrix of 1's present in it.

Problem description:

They want you to find the size of the largest square matrix which have all its elements equal to 1, we need to notice that there are several rectangles which have all its elements equal to 1 but you need to find the square only no rectangle. A square matrix has an equal number of rows and columns.

Input

The first line of input consist of T number of test cases. Each test case consist of size of N and M, each of the following N lines consist of M values either 1 or 0.

Output

You need to print the largest square sub-matrix of 1 in separate lines.

Examples

Input:
T=1
N=3,M=3
0 1 1
0 1 1
0 1 1

Output:
2

Input:
T=1
N=4,M=4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0

Output:
2

Solution Approach

(a) Recursion Approach:

We will use the logic that a square matrix can be formed only when its top-left, top and left matrix has size one less than the current square matrix, i.e. if we are using (n*n) size matrix then it must have (n-1)*(n-1) matrix in other three parts as discussed earlier.

We will use the recurrence relation: The size of the largest square submatrix ending at cell (i,j) is equal to 1 plus the minimum among the other three parts as (i-1,j), (i,j-1) and (i-1,j-1). The final maximum value will be the maximum among all such a square matrix.

if(current cell has 1)
    mat[i][j]=1+min(mat[i-1][j],mat[i][j-1],mat[i-1][j-1])
else
    mat[i][j]=0,which ends at here.

The maximum will be the maximum among all such mat[i][j].

Time complexity for the above approach in the worst case is exponential.

(b) Dynamic Programming Approach:

In this approach we will see the bottom-up approach in which we will initialize our base cases as if there is no 1 in the matrix then the answer is 0 otherwise our answer will be 1 initially, then we iterate through all the matrix position and check if current position if the matrix contains 1 or not if 1 then we check the minimum value among the three other matrices before it and 1 to it. Then we check the maximum value among our max variable and matrix value.

Time complexity for the above case is in the worst case is: O(N*M)

Space complexity for the above case is in the worst case is: O(N*M)

C++ Implementation (Recursion Approach):

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

//declare a matrix
ll mat[1003][1003];

//declare solve function which will
//take three parameters as n,m and res.
ll solve(ll n, ll m, ll& res)
{
    //base case when in first row
    //or in first column.
    if (n == 0 || m == 0) {
        //store maximum value in res.
        res = max(res, mat[n][m]);
        return mat[n][m];
    }
    //largest square-sub matrix in left of
    //current position.
    ll l = solve(n, m - 1, res);

    //largest square-sub matrix in top-left
    //of current position.
    ll lt = solve(n - 1, m - 1, res);

    //largest square-sub matrix in top
    //of current position.
    ll up = solve(n - 1, m, res);

    //declare temporary variable ans.
    ll ans = 0;
    //check if current position has 1 or not
    //if it has 1 then it must be in the largest
    //square-sub matrix.
    if (mat[n][m] != 0)
        ans = 1 + min(min(l, lt), up);

    //store maximum value in res.
    res = max(res, ans);
    return ans;
}

int main()
{
    ll t;
    cout << "Enter number of test cases: ";
    cin >> t;

    while (t--) {
        cout << "Enter size of matrix N and M: ";
        ll n, m;
        cin >> n >> m;

        cout << "Enter elements:\n";
        for (ll i = 0; i < n; i++)
            for (ll j = 0; j < m; j++)
                cin >> mat[i][j];

        ll res = 0;

        solve(n - 1, m - 1, res);

        cout << "Largest size of sub-matrix: ";
        cout << res << "\n";
    }

    return 0;
}

Output

Enter number of test cases: 3
Enter size of matrix N and M: 4 4
Enter elements:
1 1 1 1 
1 1 1 1
1 1 1 1
1 1 1 1
Largest size of sub-matrix: 4
Enter size of matrix N and M: 2 2
Enter elements:
1 1 
0 0
Largest size of sub-matrix: 1
Enter size of matrix N and M: 4 4
Enter elements:
0 0 0 0
0 1 1 0 
0 1 1 0
0 0 0 0
Largest size of sub-matrix: 2

C++ Implementation (Dynamic Programming Approach):

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main()
{
    ll t;
    cout << "Enter number of test cases: ";
    cin >> t;

    while (t--) {
        cout << "Enter size of matrix N and M: ";
        ll n, m;
        cin >> n >> m;

        ll mat[n][m];

        //initialize variable mv with 0.
        ll mv = 0;

        cout << "Enter elements:\n";
        for (ll i = 0; i < n; i++)
            for (ll j = 0; j < m; j++) {
                cin >> mat[i][j];
                {
                    if (mat[i][j])
                        mv = 1;
                }
            }
        cout << "Largest size of sub-matrix: ";

        //if there is no 1 then simply print 0.
        if (mv == 0)
            cout << 0 << "\n";
        else {
            //iterate through all elements
            //of the matrix then check for other cases.
            for (ll i = 1; i < n; i++) {
                for (ll j = 1; j < m; j++) {
                    //check if current position is 1 or not.
                    if (mat[i][j]) {
                        //check minimum among other 3 matrix.
                        if (mat[i - 1][j] and mat[i][j - 1] and mat[i - 1][j - 1]) {
                            mat[i][j] = 1 + min(min(mat[i - 1][j], mat[i][j - 1]), mat[i - 1][j - 1]);
                            mv = max(mv, mat[i][j]);
                        }
                    }
                }
            }
            cout << mv << "\n";
        }
    }

    return 0;
}

Output

Enter number of test cases: 3
Enter size of matrix N and M: 2 2
Enter elements:
1 0
0 1
Largest size of sub-matrix: 1
Enter size of matrix N and M: 2 2
Enter elements:
1 1 
1 1
Largest size of sub-matrix: 2
Enter size of matrix N and M: 3 3
Enter elements:
0 1 1
0 1 1
0 1 1
Largest size of sub-matrix: 2


Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.