📜  二进制矩阵中所有零的总覆盖率

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

二进制矩阵中所有零的总覆盖率

给定一个二进制矩阵,即它只包含 0 和 1,我们需要找到矩阵的所有零的覆盖总和,其中特定 0 的覆盖定义为左、右、上和底部方向。这些可以在任何地方,直到一个方向的角点。
例子:

Input : mat[][] = {0 0 0 0
                   1 0 0 1
                   0 1 1 0
                   0 1 0 0}
Output : 20
First four zeros are surrounded by only 
one 1.  So coverage for zeros in first 
row is 1 + 1 + 1 + 1
Zeros in second row are surrounded by
three 1's. Note that there is no 1 above.
There are 1's in all other three directions.
Coverage of zeros in second row = 3 + 3. 
Similarly counting for others also, we get
overall count as below.
1 + 1 + 1 + 1 + 3 + 3 + 2 + 2 + 2 + 2 + 2 = 20

Input : mat[][] = {1 1 1 0
                   1 0 0 1}
Output : 8
Coverage of first zero is 2
Coverages of other two zeros is 3
Total coverage = 2 + 3 + 3 = 8

解决这个问题的一个简单解决方案是独立地在零附近计数一个,即我们在每个方向上为给定矩阵的每个单元运行循环四次。每当我们在任何循环中找到 1 时,我们都会中断循环并将结果加 1。
一个有效的解决方案是执行以下操作。

  1. 从左到右遍历所有行,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。
  2. 从右到左遍历所有行,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。
  3. 从上到下遍历所有列,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。
  4. 从下到上遍历所有列,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。

在下面的代码中,一个布尔变量 isOne 被采用,一旦在当前遍历中遇到一个 1,它就变为真,对于该迭代后的所有零,结果加一,在所有四个方向上应用相同的过程以获得最终答案.每次遍历后,我们将 isOne 重置为 false。

C++
//  C++ program to get total coverage of all zeros in
// a binary matrix
#include 
using namespace std;
#define R 4
#define C 4
 
// Returns total coverage of all zeros in mat[][]
int getTotalCoverageOfMatrix(int mat[R][C])
{
    int res = 0;
 
    //  looping for all rows of matrix
    for (int i = 0; i < R; i++)
    {
        bool isOne = false;  // 1 is not seen yet
 
        // looping in columns from left to right
        // direction to get left ones
        for (int j = 0; j < C; j++)
        {
            // If one is found from left
            if (mat[i][j] == 1)
                isOne = true;
 
            // If 0 is found and we have found
            // a 1 before.
            else if (isOne)
                res++;
        }
 
        // Repeat the above process for right to
        // left direction.
        isOne = false;
        for (int j = C-1; j >= 0; j--)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
 
    // Traversing across columns for up and down
    // directions.
    for (int j = 0; j < C; j++)
    {
        bool isOne = false;  // 1 is not seen yet
        for (int i = 0; i < R; i++)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
 
        isOne = false;
        for (int i = R-1; i >= 0; i--)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
    return res;
}
 
//  Driver code to test above methods
int main()
{
    int mat[R][C] = {{0, 0, 0, 0},
        {1, 0, 0, 1},
        {0, 1, 1, 0},
        {0, 1, 0, 0}
    };
 
    cout << getTotalCoverageOfMatrix(mat);
 
    return 0;
}


Java
// Java program to get total
// coverage of all zeros in
// a binary matrix
import java .io.*;
 
class GFG
{
static int R = 4;
static int C = 4;
 
// Returns total coverage
// of all zeros in mat[][]
static int getTotalCoverageOfMatrix(int [][]mat)
{
    int res = 0;
 
    // looping for all
    // rows of matrix
    for (int i = 0; i < R; i++)
    {
        // 1 is not seen yet
        boolean isOne = false;
 
        // looping in columns from
        // left to right direction
        // to get left ones
        for (int j = 0; j < C; j++)
        {
            // If one is found
            // from left
            if (mat[i][j] == 1)
                isOne = true;
 
            // If 0 is found and we
            // have found a 1 before.
            else if (isOne)
                res++;
        }
 
        // Repeat the above
        // process for right
        // to left direction.
        isOne = false;
        for (int j = C - 1; j >= 0; j--)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
 
    // Traversing across columns
    // for up and down directions.
    for (int j = 0; j < C; j++)
    {
        // 1 is not seen yet
        boolean isOne = false;
        for (int i = 0; i < R; i++)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
 
        isOne = false;
        for (int i = R - 1; i >= 0; i--)
        {
            if (mat[i][j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
    return res;
}
 
// Driver code
static public void main (String[] args)
{
    int [][]mat = {{0, 0, 0, 0},
                   {1, 0, 0, 1},
                   {0, 1, 1, 0},
                   {0, 1, 0, 0}};
 
System.out.println(
           getTotalCoverageOfMatrix(mat));
}
}
 
// This code is contributed by anuj_67.


Python3
# Python3 program to get total coverage of all zeros in
# a binary matrix
R = 4
C = 4
 
# Returns total coverage of all zeros in mat[][]
def getTotalCoverageOfMatrix(mat):
    res = 0
     
    # looping for all rows of matrix
    for i in range(R):
         
        isOne = False # 1 is not seen yet
         
        # looping in columns from left to right
        # direction to get left ones
        for j in range(C):
             
            # If one is found from left
            if (mat[i][j] == 1):
                isOne = True
                 
            # If 0 is found and we have found
            # a 1 before.
            else if (isOne):
                res += 1
             
        # Repeat the above process for right to
        # left direction.
        isOne = False
        for j in range(C - 1, -1, -1):
            if (mat[i][j] == 1):
                isOne = True
            else if (isOne):
                res += 1
     
    # Traversing across columns for up and down
    # directions.
    for j in range(C):
        isOne = False # 1 is not seen yet
        for i in range(R):
             
            if (mat[i][j] == 1):
                isOne = True
            else if (isOne):
                res += 1
         
        isOne = False
        for i in range(R - 1, -1, -1):
            if (mat[i][j] == 1):
                isOne = True
            else if (isOne):
                res += 1
                 
    return res
 
# Driver code
mat = [[0, 0, 0, 0],[1, 0, 0, 1],[0, 1, 1, 0],[0, 1, 0, 0]]
print(getTotalCoverageOfMatrix(mat))
 
# This code is contributed by shubhamsingh10


C#
// C# program to get total coverage
// of all zeros in a binary matrix
using System;
 
class GFG {
     
static int R = 4;
static int C = 4;
 
// Returns total coverage of all zeros in mat[][]
static int getTotalCoverageOfMatrix(int [,]mat)
{
    int res = 0;
 
    // looping for all rows of matrix
    for (int i = 0; i < R; i++)
    {
        // 1 is not seen yet
        bool isOne = false;
 
        // looping in columns from left to
        // right direction to get left ones
        for (int j = 0; j < C; j++)
        {
            // If one is found from left
            if (mat[i,j] == 1)
                isOne = true;
 
            // If 0 is found and we
            // have found a 1 before.
            else if (isOne)
                res++;
        }
 
        // Repeat the above process for
        // right to left direction.
        isOne = false;
        for (int j = C-1; j >= 0; j--)
        {
            if (mat[i,j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
 
    // Traversing across columns
    // for up and down directions.
    for (int j = 0; j < C; j++)
    {
        // 1 is not seen yet
        bool isOne = false;
        for (int i = 0; i < R; i++)
        {
            if (mat[i,j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
 
        isOne = false;
        for (int i = R-1; i >= 0; i--)
        {
            if (mat[i,j] == 1)
                isOne = true;
            else if (isOne)
                res++;
        }
    }
    return res;
}
 
// Driver code to test above methods
    static public void Main ()
    {
        int [,]mat = {{0, 0, 0, 0},
                      {1, 0, 0, 1},
                      {0, 1, 1, 0},
                      {0, 1, 0, 0}};
 
    Console.WriteLine(getTotalCoverageOfMatrix(mat));
    }
}
 
// This code is contributed by vt_m.


Javascript


输出:

20