Given a matrix containing n rows. Each row has an equal number of m elements. The task is to find elements that come consecutively n times horizontally, vertically, diagonally in the matrix. If there are multiple such elements then print the smallest element. If there is no such element
then print -1.
Examples:
Input : n = 4 mat[5][5] 2 1 3 4 5 3 2 1 3 4 5 3 2 1 4 5 4 3 2 1 5 4 4 3 2 Output : 1 Input : n = 2 mat[4][4] 2 0 5 1 0 5 3 5 8 4 1 1 3 8 5 2 Output : 0
Implementation:
Python3
def check(l,row,col ,n,l2):
# Iterate through the matrix.
# Check for diagonal.
for i in range (row - n + 1 ):
for j in range (col - n + 1 ):
# Store the value in a temporary
# variable.
num = l[i][j]
# Check for the condition only
# if we have more rows and columns
# than n.
if (row - i > = n and col - j > = n):
count = 0
# check if the number is present
# n times.
for k in range (n):
# if number is not present n
# times then break
if (num ! = l[i + k][j + k]):
break
# increment the count for checking
# the condition follows.
else :
count + = 1
# if count is same or greater as that of
# n then the number follows the condition.
if (count = = n):
l2.append(num)
else :
break
#check for row condition
for i in range (row):
for j in range (col - (n - 1 ) ):
num = l[i][j]
count = 0
for k in range (n):
if num ! = l[i][j + k]:
break
else :
count + = 1
# if count is same or greater as that
# of n then the number follows the condition.
if (count = = n):
l2.append(num)
#check for column condition.
for i in range (row - (n - 1 )):
for j in range (col):
num = l[i][j]
count = 0
for k in range (n):
if num ! = l[i + k][j]:
break
else :
count + = 1
# if count is same or greater as that of
# n then the number follows the condition.
if (count = = n):
l2.append(num)
# It would require a complex code to
# check for anti-diagonal Just rotate
# the matrix and check for diagonal
# condition again.
#matrix rotation by 90 degrees.
for i in range ( 0 , int (row / 2 )):
for j in range (i, col - i - 1 ):
# store current cell in
# num variable
num = l[i][j]
# move values from right to top
l[i][j] = l[j][col - 1 - i]
# move values from bottom to right
l[j][col - 1 - i] = l[row - 1 - i][col - 1 - j]
# move values from left to bottom
l[row - 1 - i][col - 1 - j] = l[row - 1 - j][i]
# assign num to left
l[row - 1 - j][i] = num
# Iterate through the rotated matrix.
for i in range (row - n + 1 ):
for j in range (col - n + 1 ):
# Store the value in a
# temporary variable.
num = l[i][j]
# Check for the condition only if
# we have more rows and columns than n.
if (row - i > = n and col - j > = n):
count = 0
# check if the number is present
# n times.
for k in range (n):
# if number is not present n
# times then break
if (num ! = l[i + k][j + k]):
break
# increment the count for checking
# the condition follows.
else :
count + = 1
# if count is same or greater as that of
# n then the number follows the condition.
if (count = = n):
l2.append(num)
else :
break
# check if any element followed the condition.
if ( len (l2) = = 0 ):
print ( - 1 )
# print the minimum of all the elements
# which follow the condition.
else :
print ( min (l2))
if __name__ = = "__main__":
# Create Matrix
l = [[ 2 , 1 , 3 , 4 , 5 ],
[ 0 , 2 , 1 , 3 , 4 ],
[ 5 , 0 , 2 , 1 , 4 ],
[ 5 , 4 , 0 , 2 , 1 ],
[ 5 , 4 , 4 , 0 , 2 ]]
# Create a list to store all the elements
# which follow the condition.
l2 = []
check(l, 4 , 4 , 2 ,l2)
|
Output :
0
Time Complexity: O(row*column)
Auxiliary Space: O(1)