二进制矩阵中所有零的总覆盖率
给定一个二进制矩阵,即它只包含 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(在当前遍历中)并且当前元素为 0,则增加结果。
- 从右到左遍历所有行,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。
- 从上到下遍历所有列,如果已经看到 1(在当前遍历中)并且当前元素为 0,则增加结果。
- 从下到上遍历所有列,如果已经看到 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