计算二进制矩阵中被 1 阻塞的所有 0
给定二进制矩阵。任务是计算被一包围的所有零(可能不是直接邻居)。
注意:这里我们只取了上、左、下、右四个方向。
例子:
Input : Int M[][] = {{ 0, 1, 1, 0},
{ 1, 0, 0, 1},
{ 0, 1, 0, 1},
{ 1, 0, 1, 1}}
Output : 3
Explanation : All zeros which are surrounded
by 1 are (1, 1), (1, 2) and (2, 2)
Idea基于DFS。
首先,我们使用 DFS 删除矩阵中从矩阵边界可到达的所有零值单元。请注意,从边界 0 单元格可到达的任何单元格都不会被 1 包围。
Int M[][] = {{ 0, 1, 1, 0},
{ 1, 0, 0, 1},
{ 0, 1, 1, 1},
{ 1, 0, 1, 1}}
All zero cell which are reachable from boundary are in read color.
之后,我们计算二进制矩阵中剩下的所有零。
下面是上述想法的实现。
C++
// C++ program to count number of zeros
// surrounded by 1
#include
using namespace std;
#define Row 4
#define Col 5
int r[4] = { 0, 0, 1, -1 };
int c[4] = { 1, -1, 0, 0 };
bool isSafe(int x, int y, int M[][Col])
{
if (x >= 0 && x <= Row && y >= 0 &&
y <= Col && M[x][y] == 0)
return true;
return false;
}
// DFS function to mark all reachable cells from
// (x, y)
void DFS(int x, int y, int M[][Col])
{
// make it's visited
M[x][y] = 1;
for (int k = 0; k < 4; k++)
if (isSafe(x + r[k], y + c[k], M))
DFS(x + r[k], y + c[k], M);
}
// function return count of 0's which are surrounded by 1
int CountAllZero(int M[][Col])
{
// first we remove all zeros which are not
// surrounded by 1 that means we only remove
// those zeros which are reachable from
// any boundary of given matrix.
for (int i = 0; i < Col; i++)
if (M[0][i] == 0)
DFS(0, i, M);
for (int i = 0; i < Col; i++)
if (M[Row - 1][i] == 0)
DFS(Row - 1, i, M);
for (int i = 0; i < Row; i++)
if (M[i][0] == 0)
DFS(i, 0, M);
for (int i = 0; i < Row; i++)
if (M[i][Col - 1] == 0)
DFS(i, Col - 1, M);
// count all zeros which are surrounded by 1
int result = 0;
for (int i = 0; i < Row; i++)
for (int j = 0; j < Col; j++)
if (M[i][j] == 0)
result++;
return result;
}
// driver program to test above function
int main()
{
int M[][Col] = { { 1, 1, 1, 0, 1 },
{ 1, 0, 0, 1, 0 },
{ 1, 0, 1, 0, 1 },
{ 0, 1, 1, 1, 1 } };
cout << CountAllZero(M) << endl;
return 0;
}
Java
// Java program to count number of zeros
// surrounded by 1
class GFG {
final static int Row = 4;
final static int Col = 5;
static int r[] = {0, 0, 1, -1};
static int c[] = {1, -1, 0, 0};
static boolean isSafe(int x, int y, int M[][]) {
if (x >= 0 && x = 0
&& y < Col && M[x][y] == 0) {
return true;
}
return false;
}
// DFS function to mark all reachable cells from
// (x, y)
static void DFS(int x, int y, int M[][]) {
// make it's visited
M[x][y] = 1;
for (int k = 0; k < 4; k++) {
if (isSafe(x + r[k], y + c[k], M)) {
DFS(x + r[k], y + c[k], M);
}
}
}
// function return count of 0's which are surrounded by 1
static int CountAllZero(int M[][]) {
// first we remove all zeros which are not
// surrounded by 1 that means we only remove
// those zeros which are reachable from
// any boundary of given matrix.
for (int i = 0; i < Col; i++) {
if (M[0][i] == 0) {
DFS(0, i, M);
}
}
for (int i = 0; i < Col; i++) {
if (M[Row - 1][i] == 0) {
DFS(Row - 1, i, M);
}
}
for (int i = 0; i < Row; i++) {
if (M[i][0] == 0) {
DFS(i, 0, M);
}
}
for (int i = 0; i < Row; i++) {
if (M[i][Col - 1] == 0) {
DFS(i, Col - 1, M);
}
}
// count all zeros which are surrounded by 1
int result = 0;
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
if (M[i][j] == 0) {
result++;
}
}
}
return result;
}
// driver program to test above function
public static void main(String[] args) {
int M[][] = {{1, 1, 1, 0, 1},
{1, 0, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 1, 1, 1}};
System.out.print(CountAllZero(M));
}
}
// This code is contributed by Rajput-Ji
Python3
# Python3 program to count number of zeros
# surrounded by 1
Row = 4
Col = 5
r = [0, 0, 1, -1 ]
c = [1, -1, 0, 0 ]
def isSafe(x, y, M):
if (x >= 0 and x < Row and y >= 0 and y < Col):
if M[x][y] == 0:
return True
return False
# DFS function to mark all reachable cells from
# (x, y)
def DFS(x, y, M):
# make it's visited
M[x][y] = 1
for k in range(4):
if (isSafe(x + r[k], y + c[k], M)):
DFS(x + r[k], y + c[k], M)
# function return count of 0's which are surrounded by 1
def CountAllZero(M):
# first we remove all zeros which are not
# surrounded by 1 that means we only remove
# those zeros which are reachable from
# any boundary of given matrix.
for i in range(Col):
if (M[0][i] == 0):
DFS(0, i, M)
for i in range(Col):
if (M[Row - 1][i] == 0):
DFS(Row - 1, i, M)
for i in range(Row):
if (M[i][0] == 0):
DFS(i, 0, M)
for i in range(Row):
if (M[i][Col - 1] == 0):
DFS(i, Col - 1, M)
# count all zeros which are surrounded by 1
result = 0
for i in range(Row):
for j in range(Col):
if (M[i][j] == 0):
result += 1
return result
# Driver code
M = [[1, 1, 1, 0, 1], [1, 0, 0, 1, 0 ],
[1, 0, 1, 0, 1] , [ 0, 1, 1, 1, 1 ]]
print(CountAllZero(M))
# This code is contributed by shubhamsingh10
C#
// C# program to count number of zeros
// surrounded by 1
using System;
public class GFG {
readonly static int Row = 4;
readonly static int Col = 5;
static int []r = {0, 0, 1, -1};
static int []c = {1, -1, 0, 0};
static bool isSafe(int x, int y, int [,]M) {
if (x >= 0 && x = 0
&& y < Col && M[x,y] == 0) {
return true;
}
return false;
}
// DFS function to mark all reachable cells from
// (x, y)
static void DFS(int x, int y, int [,]M) {
// make it's visited
M[x,y] = 1;
for (int k = 0; k < 4; k++) {
if (isSafe(x + r[k], y + c[k], M)) {
DFS(x + r[k], y + c[k], M);
}
}
}
// function return count of 0's which are surrounded by 1
static int CountAllZero(int [,]M) {
// first we remove all zeros which are not
// surrounded by 1 that means we only remove
// those zeros which are reachable from
// any boundary of given matrix.
for (int i = 0; i < Col; i++) {
if (M[0,i] == 0) {
DFS(0, i, M);
}
}
for (int i = 0; i < Col; i++) {
if (M[Row - 1,i] == 0) {
DFS(Row - 1, i, M);
}
}
for (int i = 0; i < Row; i++) {
if (M[i,0] == 0) {
DFS(i, 0, M);
}
}
for (int i = 0; i < Row; i++) {
if (M[i,Col - 1] == 0) {
DFS(i, Col - 1, M);
}
}
// count all zeros which are surrounded by 1
int result = 0;
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
if (M[i,j] == 0) {
result++;
}
}
}
return result;
}
// driver program to test above function
public static void Main() {
int [,]M = {{1, 1, 1, 0, 1},
{1, 0, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 1, 1, 1}};
Console.Write(CountAllZero(M));
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
4