通过路径中的障碍物查找最大覆盖元素

时间:2017-02-27 18:18:04

标签: algorithm matrix graph dynamic-programming

给定MXN矩阵,其中矩阵元素是“。”要么 ”*”。在哪里代表道路,*代表街区或墙壁。人可以向前,向下和对角移动,我们需要找到最大的“。”没有被墙挡住的人所覆盖。 Example(in image)

你能否建议我有效的算法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

您是在寻找确切路径还是仅查找案例数?

编辑:这里是一个小脚本Python脚本,它创建一个随机矩阵,并计算由"墙壁定义的每个区域中的案例数量。

LinkedHashSet

结果如下:

import numpy as np

matrix = np.random.randint(2, size=(10, 10))
print(matrix)
M, N = matrix.shape

walked = []
zonesCount = []


def pathCount(x, y):
    if x < 0 or y < 0 or x >= M or y >= N:
        return 0
    if matrix[x, y] == 1:  # I replaced * by 1 and . by 0 for easier generation
        return 0
    if (x, y) in walked:
        return 0

    walked.append((x, y))

    count = 1

    for i in [x - 1, x, x + 1]:
        for j in [y - 1, y, y + 1]:
            if (i, j) != (x, y):
                count += pathCount(i, j)

    return count

for x in range(M):
    for y in range(N):
        if not (x, y) in walked:
            zonesCount.append(pathCount(x, y))

print('Max zone count :', max(zonesCount))

答案 1 :(得分:0)

你必须这样做:https://en.wikipedia.org/wiki/Flood_fill 你可以做最大的洪水。

  1. 您浏览矩阵并找到&#39; <#39;
  2. 从这一点开始泛滥。您泛滥区域的元素数量总是与您已找到的最大值进行比较。为了方便起见,您可以使用字母或数字或任何您想要的内容,但不能使用&#39;。&#39;。你添加了什么而不是&#39;。&#39;将其视为一堵墙或一个&#39; *&#39;所以你不要一次又一次地试图淹没那个区域。
  3. 继续浏览矩阵并尝试找到下一个&#39;。所有以前的&#39;。&#39;洪水淹没,所以你不会两次考虑相同的区域。
  4. 重做2,直到您无法再找到&#39;。最大值将包含您的答案。
  5. 当你得到答案时,你可以回到矩阵中,你已经知道你用最大结果淹没了该区域的字母或数字,这样你就可以打印出最大的区域。