Minimum time required to fill the entire matrix with 1’s
Given a matrix of size N consisting of 0‘s and 1‘s, the task is to find the minimum time required to fill the entire matrix with 1‘s. Every 1 at an instant in the matrix, can convert all 0‘s to 1 in its eight adjacent cells,i.e. a 1 present at (i,j) can convert all 0‘s to 1 at positions (i, j-1), (i, j+1), (i-1, j), (i+1, j), (i-1, j-1), (i-1, j+1), (i+1, j-1), (i+1, j+1).
Examples:
Input: N = 3, mtrx[][] = {{1,0,0},{0,0,1},{0,0,0}}
Output: 2
Explanation:
Initially the matrix appears to be
1, 0, 0
0, 0, 1
0, 0, 0
After the first instant of time, the new matrix is
1, 1, 1
1, 1, 1
0, 1, 1
After the 2nd instant the remaining 0 is converted to 1.
Input: N = 5,
mtrx[][] = {{0,0,0,0,0},
{1,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,1,0}}
Output: 3
Approach:
In order to solve this problem, we are using the BFS approach. Traverse through the matrix and store the indices of the matrix with 1 initially in a queue. Loop until the queue gets empty and converts the adjacent valid cells of all queue elements to 1. The number of levels of BFS traversal that has led to the conversion of at least one 0 to 1 is the answer.
The below code is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int numberOfSteps( int n,vector<vector< int >> mtrx)
{
queue<pair< int , int >> q;
for ( int i = 0; i < n; i++) {
for ( int j = 0; j < n; j++) {
if (mtrx[i][j] == 1) {
q.push({i,j});
}
}
}
int step = 0 ;
while (!q.empty())
{
int qsize = q.size();
while (qsize--)
{
pair< int , int > p = q.front();
q.pop();
int i = p.first;
int j = p.second;
if ((j > 0) && mtrx[i][j-1] == 0)
{
mtrx[i][j-1] = 1;
q.push({i,j-1});
}
if ((i < n-1) && mtrx[i+1][j] == 0)
{
mtrx[i+1][j] = 1;
q.push({i+1,j});
}
if ((j < n-1) && mtrx[i][j+1] == 0)
{
mtrx[i][j+1] = 1;
q.push({i,j + 1});
}
if ((i > 0) && mtrx[i-1][j] == 0)
{
mtrx[i-1][j] = 1;
q.push({i-1,j});
}
if ((i > 0) && (j > 0) &&
mtrx[i-1][j-1] == 0)
{
mtrx[i-1][j-1] = 1;
q.push({i-1,j-1});
}
if ((i > 0) && (j < (n-1)) &&
mtrx[i-1][j+1] == 0)
{
mtrx[i-1][j+1] = 1;
q.push({i-1,j+1});
}
if ((i < (n-1)) && (j < (n-1)) &&
mtrx[i+1][j+1] == 0)
{
mtrx[i+1][j+1] = 1;
q.push({i+1,j + 1});
}
if ((i < (n-1)) && (j > 0) &&
mtrx[i+1][j-1] == 0)
{
mtrx[i+1][j-1] = 1;
q.push({i+1,j-1});
}
}
step++;
}
return step-1;
}
int main()
{
int n = 5 ;
vector<vector< int >> mtrx = {{0,0,0,0,0},
{1,0,0,0,0},
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,0,1,0}};
cout << numberOfSteps(n, mtrx);
return 0;
}
|
Java
import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int numberOfSteps( int n, int [][] mtrx)
{
Queue<pair> q = new LinkedList<>();
for ( int i = 0 ; i < n; i++)
{
for ( int j = 0 ; j < n; j++)
{
if (mtrx[i][j] == 1 )
{
q.add( new pair(i, j));
}
}
}
int step = 0 ;
while (!q.isEmpty())
{
int qsize = q.size();
while (qsize-- > 0 )
{
pair p = q.peek();
q.remove();
int i = p.first;
int j = p.second;
if ((j > 0 ) && mtrx[i][j - 1 ] == 0 )
{
mtrx[i][j - 1 ] = 1 ;
q.add( new pair(i, j - 1 ));
}
if ((i < n - 1 ) && mtrx[i + 1 ][j] == 0 )
{
mtrx[i + 1 ][j] = 1 ;
q.add( new pair(i + 1 , j));
}
if ((j < n - 1 ) && mtrx[i][j + 1 ] == 0 )
{
mtrx[i][j + 1 ] = 1 ;
q.add( new pair(i, j + 1 ));
}
if ((i > 0 ) && mtrx[i - 1 ][j] == 0 )
{
mtrx[i - 1 ][j] = 1 ;
q.add( new pair(i - 1 , j));
}
if ((i > 0 ) && (j > 0 ) &&
mtrx[i - 1 ][j - 1 ] == 0 )
{
mtrx[i - 1 ][j - 1 ] = 1 ;
q.add( new pair(i - 1 , j - 1 ));
}
if ((i > 0 ) && (j < (n - 1 )) &&
mtrx[i - 1 ][j + 1 ] == 0 )
{
mtrx[i - 1 ][j + 1 ] = 1 ;
q.add( new pair(i - 1 , j + 1 ));
}
if ((i < (n - 1 )) && (j < (n - 1 )) &&
mtrx[i + 1 ][j + 1 ] == 0 )
{
mtrx[i + 1 ][j + 1 ] = 1 ;
q.add( new pair(i + 1 , j + 1 ));
}
if ((i < (n - 1 )) && (j > 0 ) &&
mtrx[i + 1 ][j - 1 ] == 0 )
{
mtrx[i + 1 ][j - 1 ] = 1 ;
q.add( new pair(i + 1 , j - 1 ));
}
}
step++;
}
return step - 1 ;
}
public static void main(String[] args)
{
int n = 5 ;
int [][]mtrx = { { 0 , 0 , 0 , 0 , 0 },
{ 1 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 0 , 0 , 0 },
{ 0 , 0 , 1 , 0 , 0 },
{ 0 , 0 , 0 , 1 , 0 } };
System.out.print(numberOfSteps(n, mtrx));
}
}
|
Python3
def numberOfSteps(n,mtrx):
q = []
for i in range (n):
for j in range (n):
if (mtrx[i][j] = = 1 ):
q.append([i,j])
step = 0
while ( len (q)):
qsize = len (q)
while (qsize):
p = q[ 0 ]
q.remove(q[ 0 ])
i = p[ 0 ]
j = p[ 1 ]
if ((j > 0 ) and mtrx[i][j - 1 ] = = 0 ):
mtrx[i][j - 1 ] = 1
q.append([i, j - 1 ])
if ((i < n - 1 ) and mtrx[i + 1 ][j] = = 0 ):
mtrx[i + 1 ][j] = 1
q.append([i + 1 , j])
if ((j < n - 1 ) and mtrx[i][j + 1 ] = = 0 ):
mtrx[i][j + 1 ] = 1
q.append([i, j + 1 ])
if ((i > 0 ) and mtrx[i - 1 ][j] = = 0 ):
mtrx[i - 1 ][j] = 1
q.append([i - 1 , j])
if ((i > 0 ) and (j > 0 ) and
mtrx[i - 1 ][j - 1 ] = = 0 ):
mtrx[i - 1 ][j - 1 ] = 1
q.append([i - 1 , j - 1 ])
if ((i > 0 ) and (j < (n - 1 )) and
mtrx[i - 1 ][j + 1 ] = = 0 ):
mtrx[i - 1 ][j + 1 ] = 1
q.append([i - 1 , j + 1 ])
if ((i < (n - 1 )) and (j < (n - 1 )) and
mtrx[i + 1 ][j + 1 ] = = 0 ):
mtrx[i + 1 ][j + 1 ] = 1
q.append([i + 1 , j + 1 ])
if ((i < (n - 1 )) and (j > 0 ) and
mtrx[i + 1 ][j - 1 ] = = 0 ):
mtrx[i + 1 ][j - 1 ] = 1
q.append([i + 1 ,j - 1 ])
qsize - = 1
step + = 1
return step - 1
if __name__ = = '__main__' :
n = 5
mtrx = [[ 0 , 0 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 , 0 ],
[ 0 , 0 , 0 , 1 , 0 ]]
print (numberOfSteps(n, mtrx))
|
C#
using System;
using System.Collections.Generic;
class GFG{
public class pair
{
public int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static int numberOfSteps( int n,
int [,] mtrx)
{
Queue<pair> q = new Queue<pair>();
for ( int i = 0; i < n; i++)
{
for ( int j = 0; j < n; j++)
{
if (mtrx[i, j] == 1)
{
q.Enqueue( new pair(i, j));
}
}
}
int step = 0;
while (q.Count != 0)
{
int qsize = q.Count;
while (qsize-- > 0)
{
pair p = q.Peek();
q.Dequeue();
int i = p.first;
int j = p.second;
if ((j > 0) &&
mtrx[i, j - 1] == 0)
{
mtrx[i, j - 1] = 1;
q.Enqueue( new pair(i, j - 1));
}
if ((i < n - 1) &&
mtrx[i + 1, j] == 0)
{
mtrx[i + 1, j] = 1;
q.Enqueue( new pair(i + 1, j));
}
if ((j < n - 1) &&
mtrx[i, j + 1] == 0)
{
mtrx[i, j + 1] = 1;
q.Enqueue( new pair(i, j + 1));
}
if ((i > 0) &&
mtrx[i - 1, j] == 0)
{
mtrx[i - 1, j] = 1;
q.Enqueue( new pair(i - 1, j));
}
if ((i > 0) && (j > 0) &&
mtrx[i - 1, j - 1] == 0)
{
mtrx[i - 1, j - 1] = 1;
q.Enqueue( new pair(i - 1, j - 1));
}
if ((i > 0) && (j < (n - 1)) &&
mtrx[i - 1, j + 1] == 0)
{
mtrx[i - 1, j + 1] = 1;
q.Enqueue( new pair(i - 1, j + 1));
}
if ((i < (n - 1)) && (j < (n - 1)) &&
mtrx[i + 1, j + 1] == 0)
{
mtrx[i + 1, j + 1] = 1;
q.Enqueue( new pair(i + 1, j + 1));
}
if ((i < (n - 1)) && (j > 0) &&
mtrx[i + 1, j - 1] == 0)
{
mtrx[i + 1, j - 1] = 1;
q.Enqueue( new pair(i + 1, j - 1));
}
}
step++;
}
return step - 1;
}
public static void Main(String[] args)
{
int n = 5;
int [,]mtrx = {{0, 0, 0, 0, 0},
{1, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 1, 0, 0},
{0, 0, 0, 1, 0}};
Console.Write(numberOfSteps(n, mtrx));
}
}
|
Javascript
<script>
function numberOfSteps(n,mtrx){
let q = []
for (let i = 0; i < n; i++)
{
for (let j = 0; j < n; j++)
{
if (mtrx[i][j] == 1)
q.push([i, j])
}
}
let step = 0
while (q.length){
let qsize = q.length
while (qsize){
let p = q.shift()
let i = p[0]
let j = p[1]
if ((j > 0) && mtrx[i][j - 1] == 0){
mtrx[i][j - 1] = 1
q.push([i, j - 1])
}
if ((i < n-1) && mtrx[i + 1][j] == 0){
mtrx[i + 1][j] = 1
q.push([i + 1, j])
}
if ((j < n-1) && mtrx[i][j + 1] == 0){
mtrx[i][j + 1] = 1
q.push([i, j + 1])
}
if ((i > 0) && mtrx[i - 1][j] == 0){
mtrx[i - 1][j] = 1
q.push([i - 1, j])
}
if ((i > 0) && (j > 0) &&
mtrx[i - 1][j - 1] == 0){
mtrx[i - 1][j - 1] = 1
q.push([i - 1, j - 1])
}
if ((i > 0) && (j < (n-1)) &&
mtrx[i - 1][j + 1] == 0){
mtrx[i - 1][j + 1] = 1
q.push([i - 1, j + 1])
}
if ((i < (n - 1)) && (j < (n - 1)) &&
mtrx[i + 1][j + 1] == 0){
mtrx[i + 1][j + 1] = 1
q.push([i + 1, j + 1])
}
if ((i < (n - 1)) && (j > 0) &&
mtrx[i + 1][j - 1] == 0){
mtrx[i + 1][j - 1] = 1
q.push([i + 1,j - 1])
}
qsize -= 1
}
step += 1
}
return step-1
}
let n = 5
let mtrx = [[ 0, 0, 0, 0, 0 ],
[ 1, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0 ],
[ 0, 0, 1, 0, 0 ],
[ 0, 0, 0, 1, 0 ]]
document.write(numberOfSteps(n, mtrx), "</br>" )
</script>
|
Time Complexity: O(n*n)
Auxiliary Space: O(n*n)
Last Updated :
26 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...