📜  在二进制矩阵中查找最大路径长度

📅  最后修改于: 2022-05-13 01:57:23.019000             🧑  作者: Mango

在二进制矩阵中查找最大路径长度

给定一个方阵mat ,其中每个元素都是01 。值 1 表示已连接,0 表示未连接。任务是在将最多一个 0更改为1后找到矩阵中路径的最大长度。路径是 4 向连接的 1 组。

例子:

朴素的方法:想法是将每个“0”一个一个地更改为“1”,并进行深度优先搜索以找到最大路径的大小。



高效的方法:在朴素的方法中,我们检查了每个“0”。但是,我们也可以通过存储每个组的大小来提高效率,这样我们就不必使用深度优先搜索来重复计算相同的大小。

注意:当 0 接触到同一组时,我们需要小心。例如,考虑 grid = [[0, 1], [1, 1]]。改变01后的0的右侧和底部的邻居将属于同一组。

我们可以通过跟踪组Id (或Index )来解决这个问题,这对于每个组都是唯一的。

  • 对于每个组,用值Index填充它并记住它的大小作为数组area[Index]中的一个元素,可以通过深度优先搜索找到它。
  • 然后对于每个0 ,查看相邻的组 ID 并添加这些组的面积,并为我们正在切换的 0添加 1。这会给我们答案,我们从之前的答案中取最大值。

下面是上述方法的实现:

Python3
# Python3 implementation of above approach
  
# check if index is within range
def neighbors(r, c, N):
    for nr, nc in ((r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)):
        if 0 <= nr < N and 0 <= nc < N:
            yield nr, nc
  
# dfs to calculate length of path
def dfs(R, C, index, grid, N):
    ans = 1
    grid[R][C] = index
    for nr, nc in neighbors(R, C, N):
        if grid[nr][nc] == 1:
            ans += dfs(nr, nc, index)
  
    return ans
  
  
# function to return largest possible length of Path
def largestPath(grid):
  
    N = len(grid)
  
    area = {}
    index = 2
  
    for i in range(N):
        for j in range(N):
            if grid[i][j] == 1:
                area[index] = dfs(i, j, index, grid, N)
                index += 1
  
    ans = max(area.values() or [0])
  
    for i in range(N):
        for j in range(N):
            if grid[i][j] == 0:
                seen = {grid[nr][nc] for nr, nc in neighbors(i, j, N) if grid[nr][nc] > 1}
                ans = max(ans, 1 + sum(area[i] for i in seen))
  
    # return maximum possible length
    return ans
  
# Driver code
I = [[1, 0], [0, 1]]
  
# Function call to print answer
print(largestPath(I))
  
# This code is written by
# Sanjit_Prasad


输出:
3

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。