在二进制矩阵中查找所有数构成的“ +”号

时间:2018-10-04 14:44:45

标签: python-3.x algorithm matrix graph-algorithm binary-matrix

我所遇到的问题类似于在这里找到的问题:https://www.geeksforgeeks.org/find-size-of-the-largest-formed-by-all-ones-in-a-binary-matrix/

区别在于'+'必须将矩阵中的所有其他单元都设为零。例如:

00100  
00100   
11111   
00100   
00100

这将是一个5x5矩阵,带有2个“ +”,一个在另一个内部。

另一个例子:

00010000  
00010000  
00010000  
11111111  
00010000  
00010010
00010111
00010010

此矩阵为8x8,将具有3个“ +”,其中一个是右下角的小3x3矩阵,另一个2个是由5x5矩阵形成的,一个在另一个内部,类似于第一个示例。

使用上面的链接中的代码,我只能得到到目前为止:

M = [[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0],
     [0, 0, 0, 1, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1],
     [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 1, 0],
     [0, 0, 0, 1, 0, 1, 1, 1], [0, 0, 0, 1, 0, 0, 1, 0]]
R = len(M)
N = len(M)
C = len(M[0])
left = [[0 for k in range(C)] for l in range(R)]
right = [[0 for k in range(C)] for l in range(R)]
top = [[0 for k in range(C)] for l in range(R)]
bottom = [[0 for k in range(C)] for l in range(R)]
for i in range(R):
    top[0][i] = M[0][i]
    bottom[N - 1][i] = M[N - 1][i]
    left[i][0] = M[i][0]
    right[i][N - 1] = M[i][N - 1]
for i in range(R):
    for j in range(1,R):
        if M[i][j] == 1:
            left[i][j] = left[i][j - 1] + 1
        else:
            left[i][j] = 1
        if (M[j][i] == 1):
            top[j][i] = top[j - 1][i] + 1
        else:
            top[j][i] = 0
        j = N - 1 - j
        if (M[j][i] == 1):
            bottom[j][i] = bottom[j + 1][i] + 1
        else:
            bottom[j][i] = 0
        if (M[i][j] == 1):
            right[i][j] = right[i][j + 1] + 1
        else:
            right[i][j] = 0
        j = N - 1 - j
n = 0
for i in range(N):
    for j in range(N):
        length = min(top[i][j], bottom[i][j], left[i][j], right[i][j])
        if length > n:
            n = length
print(n)

当前,它返回'+'最长边的输出。所需的输出将是方矩阵中的“ +”号。

我无法检查矩阵中的所有其他单元为零,并且如果整个矩阵中有一个,则很难找到一个单独的“ +”。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不想破坏解决此问题的乐趣,因此,有一些提示而不是解决方案:

  1. 尝试编写一个给定方阵作为输入的子例程(一个函数),以决定此输入矩阵是否为“ +”(例如,如果函数为“ +”,则该函数返回“ 1” ',否则为'0'。
  2. 从1开始修改函数,以便您可以将完整矩阵的子矩阵作为输入提供给它(要在其中计数“ +”)。更具体地说,输入可以是子矩阵左上角条目的坐标及其大小。返回值应与1相同。
  3. 您可以编写一个循环来检查给定矩阵的所有子矩阵,并使用2中的函数对“ +”进行计数吗?

这里有一些小注释:导致的算法在多项式时间内(在输入矩阵的维数内)运行,因此基本上不需要花费太长时间。 我没有考虑太多,但是可能可以使算法更有效。 另外,您可能应该考虑是否将被0包围的'1'算作'+'。