In: Computer Science
Find all rectangles filled with 0
We have one 2D array, filled with zeros and ones. We have to find the starting point and ending point of all rectangles filled with 0. It is given that rectangles are separated and do not touch each other however they can touch the boundary of the array.A rectangle might contain only one element. In Javascript preferred.
Examples:
input = [
            [1, 1, 1, 1, 1, 1, 1],
            [1, 1, 1, 1, 1, 1, 1],
            [1, 1, 1, 0, 0, 0, 1],
            [1, 0, 1, 0, 0, 0, 1],
            [1, 0, 1, 1, 1, 1, 1],
            [1, 0, 1, 0, 0, 0, 0],
            [1, 1, 1, 0, 0, 0, 1],
            [1, 1, 1, 1, 1, 1, 1]
        ]
Output:
[
  [2, 3, 3, 5], [3, 1, 5, 1], [5, 3, 6, 5]
]
Explanation:
We have three rectangles here, starting from 
(2, 3), (3, 1), (5, 3)
Input = [
            [1, 0, 1, 1, 1, 1, 1],
            [1, 1, 0, 1, 1, 1, 1],
            [1, 1, 1, 0, 0, 0, 1],
            [1, 0, 1, 0, 0, 0, 1],
            [1, 0, 1, 1, 1, 1, 1],
            [1, 1, 1, 0, 0, 0, 0],
            [1, 1, 1, 1, 1, 1, 1],
            [1, 1, 0, 1, 1, 1, 0]
        ]
Output:
[
  [0, 1, 0, 1], [1, 2, 1, 2], [2, 3, 3, 5], 
  [3, 1, 4, 1], [5, 3, 5, 6], [7, 2, 7, 2], 
  [7, 6, 7, 6]
]
<script language="JavaScript">
var nl = getNewLine()
function getNewLine() {
   var agent = navigator.userAgent
   if (agent.indexOf("Win") >= 0)
       return "\r\n"
   else
       if (agent.indexOf("Mac") >=
0)
           return "\r"
return "\r"
}
pagecode = '<scr'+'ipt language="JavaScript">
var nl = getNewLine()
function getNewLine() {
   var agent = navigator.userAgent
   if (agent.indexOf("Win") >= 0)
       return "\\r\\n"
   else
       if (agent.indexOf("Mac") >=
0)
           return "\\r"
return "\\r"
}
pagecode = \'# Python program to find all
# rectangles filled with 0
function findend(i,j,a,output,index):
   x = len(a)
   y = len(a[0])
   # flag to check column edge case,
   # initializing with 0
   flagc = 0
   # flag to check row edge case,
   # initializing with 0
   flagr = 0
for m in range(i,x):
       # loop breaks where first 1
encounters
       if a[m][j] == 1:
           flagr = 1 # set
the flag
           break
       # pass because already
processed
       if a[m][j] == 5:
           pass
for n in range(j, y):
           # loop breaks
where first 1 encounters
           if a[m][n] ==
1:
          
    flagc = 1 # set the flag
          
    break
           # fill
rectangle elements with any
           # number so that
we can exclude
           # next
time
           a[m][n] = 5
   if flagr == 1:
       output[index].append( m-1)
   else:
       # when end point touch the
boundary
       output[index].append(m)
   if flagc == 1:
       output[index].append(n-1)
   else:
       # when end point touch the
boundary
       output[index].append(n)
def get_rectangle_coordinates(a):
   # retrieving the column size of array
   size_of_array = len(a)
   # output array where we are going
   # to store our output
   output = []
   # It will be used for storing start
   # and end location in the same index
   index = -1
   for i in range(0,size_of_array):
       for j in range(0, len(a[0])):
           if a[i][j] ==
0:
          
    # storing initial position
          
    # of rectangle
          
    output.append([i, j])
          
    # will be used for the
          
    # last position
          
    index = index + 1  
   
          
    findend(i, j, a, output, index)
   print (output)
# driver code
tests = [
           [1, 1, 1, 1,
1, 1, 1],
           [1, 1, 1, 1, 1,
1, 1],
           [1, 1, 1, 0, 0,
0, 1],
           [1, 0, 1, 0, 0,
0, 1],
           [1, 0, 1, 1, 1,
1, 1],
           [1, 0, 1, 0, 0,
0, 0],
           [1, 1, 1, 0, 0,
0, 1],
           [1, 1, 1, 1, 1,
1, 1]
]
get_rectangle_coordinates(tests)
\'
document.write(pagecode);
</scr'+'ipt>'
document.write(pagecode);
</script>