生成矩阵的程序,其中每个单元格都在Python中保持曼哈顿到最接近0的距离

假设我们有一个二进制矩阵。我们必须找到相同的矩阵,但是每个像元的值都是到最接近0的曼哈顿距离。我们可以假设矩阵中至少存在一个0。

所以,如果输入像

101
101
110

那么输出将是

101
101
210

因为只有左下角的单元格的距离是2到最接近的0。

为了解决这个问题,我们将遵循以下步骤-

  • m:=矩阵的行大小,n:=矩阵的列大小

  • 对于0到m范围内的y,执行

    • 如果matrix [y,x]不为零,则

    • 矩阵[y,x]:=无穷大

    • 对于0到n范围内的x,执行

    • 对于0到m范围内的y,执行

      • 如果y不为零,则

      • 如果x不为零,则

      • matrix [y,x] =矩阵[y,x]和矩阵[y-1,x] +1的最小值

      • 矩阵[y,x] =矩阵[y,x]和矩阵[y,x-1] +1的最小值

      • 对于0到n范围内的x,执行

      • 对于y在m-1到0的范围内,减1,

        • 如果y + 1 <m,则

        • 如果x + 1 <n,则

        • 矩阵[y,x] =矩阵[y,x]和矩阵[y + 1,x] +1的最小值

        • 矩阵[y,x] =矩阵[y,x]和矩阵[y,x + 1] +1的最小值

        • 对于范围n-1到0的x,减1,

        • 返回矩阵

        让我们看下面的实现以更好地理解-

        示例

        import math
        class Solution:
           def solve(self, matrix):
              m, n = len(matrix), len(matrix[0])
              for y in range(m):
                 for x in range(n):
                    if matrix[y][x]:
                       matrix[y][x] = math.inf
              for y in range(m):
                 for x in range(n):
                    if y:
                       matrix[y][x] = min(matrix[y][x], matrix[y - 1][x] + 1)
                    if x:
                       matrix[y][x] = min(matrix[y][x], matrix[y][x - 1] + 1)
              for y in range(m - 1, -1, -1):
                 for x in range(n - 1, -1, -1):
                    if y + 1 < m:
                       matrix[y][x] = min(matrix[y][x], matrix[y + 1][x] + 1)
                    if x + 1 < n:
                       matrix[y][x] = min(matrix[y][x], matrix[y][x + 1] + 1)
              return matrix
        ob = Solution()matrix = [ [1, 0, 1], [1, 0, 1], [1, 1, 0] ]
        print(ob.solve(matrix))

        输入值

        [[1, 0, 1],
        [1, 0, 1],
        [1, 1, 0] ]

        输出结果

        [[1, 0, 1], [1, 0, 1], [2, 1, 0]]