考虑一个大小为10 * 10的网格,其中包括随机的0和1。我想确定网格中最高级别的等腰三角形
网格:
TNS_ADMIN
预期输出:
三角形的最高水平为3
答案 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
希望对您有所帮助,如果还有其他问题,请发表评论。 :)