📜  查找所有填充为 0 的矩形的Python程序

📅  最后修改于: 2022-05-13 01:54:19.086000             🧑  作者: Mango

查找所有填充为 0 的矩形的Python程序

我们有一个二维数组,用零和一填充。我们必须找到所有填充为 0 的矩形的起点和终点。假设矩形是分开的并且不相互接触,但是它们可以接触数组的边界。一个矩形可能只包含一个元素。
例子:

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]
]

第 1 步:逐行和逐列查找 0
步骤 2:当遇到任何 0 时,将其位置保存在输出数组中,并使用循环将所有与该位置相关的 0 更改为任意公共数字,以便我们下次将其排除在处理之外。
第 3 步:当您在第 2 步中更改所有相关的 0 时,将最后处理的 0 的位置存储在输出数组中的同一索引中。
第 4 步:当你触摸边缘时要特别小心,不要减去 -1,因为循环在确切的位置断裂。
以下是上述方法的实现:

Python3
# Python program to find all 
# rectangles filled with 0
  
def 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)


输出:

[[2, 3, 3, 5], [3, 1, 5, 1], [5, 3, 6, 5]]

有关详细信息,请参阅有关查找所有填充为 0 的矩形的完整文章!