logo

Total täckning av alla nollor i en binär matris

Prova det på GfG Practice ' title= #practiceLinkDiv { display: ingen !viktigt; }

Givet en binär matris, det vill säga att den bara innehåller 0:or och 1:or, behöver vi hitta summan av täckningen av alla nollor i matrisen där täckningen för en viss 0 definieras som det totala antalet ettor runt en nolla i riktningar vänster höger upp och botten. De kan vara var som helst tills hörnet pekar i en riktning. 

Exempel:  

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
Recommended Practice Täckning av alla nollor i en binär matris Prova!

A enkel lösning för att lösa detta problem är att räkna ettor runt nollor oberoende, dvs. vi kör loop fyra gånger i varje riktning för varje cell för den givna matrisen. Varje gång vi hittar en 1 i någon slinga bryter vi slingan och ökar resultatet med 1.



En effektiv lösning är att göra följande. 

  1. Traversera alla rader från vänster till höger ökningsresultat om en 1 redan ses (i aktuell genomgång) och det aktuella elementet är 0.
  2. Traversera alla rader från höger till vänster ökningsresultat om en 1 redan syns (vid strömpassering) och det aktuella elementet är 0.
  3. Traversera alla kolumner från topp till botten ökningsresultat om en 1 redan ses (i aktuell genomgång) och det aktuella elementet är 0.
  4. Traversera alla kolumner från botten till toppresultat om en 1 redan ses (i aktuell genomgång) och det aktuella elementet är 0.

I nedanstående kod tas en boolesk variabel isOne som görs sann så snart en etta påträffas i aktuell genomgång för alla nollor efter att iterationsresultatet ökats med samma procedur tillämpas i alla fyra riktningarna för att få det slutgiltiga svaret. Vi återställer isOne till false efter varje övergång.

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[ij] == 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[ij] == 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[ij] == 1)  isOne = true;  else if (isOne)  res++;  }  isOne = false;  for (int i = R-1; i >= 0; i--)  {  if (mat[ij] == 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
<script>  // Javascript program to get total   // coverage of all zeros in   // a binary matrix    let R = 4;  let C = 4;  // Returns total coverage  // of all zeros in mat[][]  function getTotalCoverageOfMatrix(mat)  {  let res = 0;  // looping for all   // rows of matrix  for (let i = 0; i < R; i++)  {  // 1 is not seen yet  let isOne = false;   // looping in columns from   // left to right direction  // to get left ones  for (let 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 (let 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 (let j = 0; j < C; j++)  {  // 1 is not seen yet  let isOne = false;   for (let i = 0; i < R; i++)  {  if (mat[i][j] == 1)  isOne = true;  else if (isOne)  res++;  }  isOne = false;  for (let i = R - 1; i >= 0; i--)  {  if (mat[i][j] == 1)  isOne = true;  else if (isOne)  res++;  }  }  return res;  }    let mat = [[0 0 0 0]  [1 0 0 1]  [0 1 1 0]  [0 1 0 0]];    document.write(getTotalCoverageOfMatrix(mat)); </script> 

Produktion
20

Tidskomplexitet: O(n2
Hjälputrymme: O(1)

 

Skapa frågesport