Algorithm 查找路径中无障碍物阻挡的最大覆盖元素

Algorithm 查找路径中无障碍物阻挡的最大覆盖元素,algorithm,matrix,graph,dynamic-programming,Algorithm,Matrix,Graph,Dynamic Programming,给定MXN矩阵,其中矩阵元素为“.”或“*”。哪里表示道路,*表示块或墙。人可以向前、向下和斜向移动相邻区域,我们需要找到被人覆盖的最大“距离”,而不被墙阻挡 你能给我建议一个有效的算法来解决这个问题吗?你是在寻找确切的路径还是只寻找案例的数量 编辑:这里是一个smallp Python脚本,它创建了一个随机矩阵,并计算“墙”定义的每个区域中的案例数 你必须这样做: 尽你最大的努力 你通过矩阵找到一个“.” 从那个点开始做洪水。淹没该区域的元素数量始终与已找到的最大值进行比较。为了方便起见,您可

给定MXN矩阵,其中矩阵元素为“.”或“*”。哪里表示道路,*表示块或墙。人可以向前、向下和斜向移动相邻区域,我们需要找到被人覆盖的最大“距离”,而不被墙阻挡


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

你是在寻找确切的路径还是只寻找案例的数量

编辑:这里是一个smallp Python脚本,它创建了一个随机矩阵,并计算“墙”定义的每个区域中的案例数

你必须这样做: 尽你最大的努力

  • 你通过矩阵找到一个“.”
  • 从那个点开始做洪水。淹没该区域的元素数量始终与已找到的最大值进行比较。为了方便起见,您可以大量使用字母、数字或任何您想要的内容,但不能使用“.”。你所加的不是“。”把它看成墙或“*”,这样你就不会一次又一次地试图淹没那个区域。<李>
  • 继续浏览矩阵并尝试查找下一个“.”。所有前面的'.',在那里淹没,所以你不会考虑相同的区域两次。<李>
  • 重做2,直到找不到更多的“.”。最大值将包含您的答案
  • 当你得到答案后,你可以回到矩阵中,你已经知道了字母或数字,你用最大的结果填充了区域,这样你就可以打印出最大的区域
    我认为问题在于你可以通过循环得到无止境的路径。您是否允许用户在同一图元上多次行走?用户可以选择任何路径,但不能通过墙。所以可以有多条路径,但他需要选择“覆盖最大值”,而不通过任何块。刚才给了你一个脚本示例。@MathieuBour你的算法给了我错误的答案。我尝试了我的例子(在问题中给出的链接),它给我80,但答案是21。对不起,我的坏,我修改了问题。我需要找到人所覆盖的最大值。他可以选择任何道路。请看一个你们能理解的例子。它看起来像洪水填充,但在洪水填充中,您有一些起点,但这个起点没有任何起点。@abhi2244您可以选择任何起点。并进行洪水和更换。带*。你加的*的数量是你的面积。下一步是找到下一个。这将是你的第二次洪水等等。
    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))
    
    [[0 0 1 0 0 0 1 0 1 0]
     [1 0 1 0 0 0 1 0 1 1]
     [0 1 0 0 1 0 0 1 1 1]
     [0 0 1 0 0 0 1 1 0 1]
     [1 0 1 1 1 1 0 1 1 0]
     [1 0 1 1 1 1 0 1 1 0]
     [0 0 0 1 1 1 0 0 0 0]
     [1 0 0 1 1 0 0 1 1 0]
     [0 1 0 1 0 0 1 0 1 1]
     [0 1 1 0 0 0 1 0 1 0]]
    Max zone count : 50