如何在0和1的网格中识别等腰三角形?

时间:2019-04-08 08:31:48

标签: python arrays

考虑一个大小为10 * 10的网格,其中包括随机的0和1。我想确定网格中最高级别的等腰三角形

网格:

TNS_ADMIN

预期输出:

三角形的最高水平为3

1 个答案:

答案 0 :(得分:0)

我假设只找到全部1或全部0的三角形向上方向。例如:

    1         
  1 1 1       0 
1 1 1 1 1   0 0 0

您可以从最高点开始,通过backtracking找到最大三角形,我在find_max_triangle中实现了该三角形,然后遍历所有矩阵,并从矩阵的每个点开始。

我们可以跳过一些要点来减少遍历时间。优化是通过当前的max_level修剪i,j:

def max_triangles(matrix):
    m, n = len(matrix), len(matrix[0])
    max_level = 1

    def find_max_triangle(x, y, v):
        nonlocal max_level
        cur_level = 1
        while True:
            x += 1
            if x == m:
                return
            for i in range(-cur_level, cur_level + 1):
                _y = y + i
                if _y < 0 or _y >= n or matrix[x][_y] != v:
                    return
            cur_level += 1
            max_level = max(max_level, cur_level)

    for i in range(m):
        # optimization: pruning i by current max_level
        if i + max_level >= m:
            break
        for j in range(n):
            # optimization: pruning j by current max_level
            if j - max_level >= 0 and j + max_level < n:
                find_max_triangle(i, j, matrix[i][j])

    return max_level

测试并输出:

matrix = [[1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 1, 1, 1, 0, 1, 1, 1],
          [1, 1, 1, 1, 0, 1, 0, 1, 1, 1],
          [1, 0, 1, 1, 1, 1, 1, 1, 1, 1],
          [1, 1, 1, 0, 1, 0, 0, 1, 1, 1],
          [1, 1, 0, 1, 1, 1, 1, 1, 1, 1],
          [0, 1, 1, 1, 1, 1, 1, 1, 0, 0],
          [1, 1, 1, 0, 1, 1, 1, 1, 0, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 0, 1],
          [1, 1, 1, 1, 1, 1, 1, 1, 0, 1]]

print(max_triangles(matrix))

# output 3

希望对您有所帮助,如果还有其他问题,请发表评论。 :)