Укупна покривеност свих нула у бинарној матрици

Укупна покривеност свих нула у бинарној матрици
Пробајте на ГфГ пракси #працтицеЛинкДив { дисплаи: ноне !импортант; }

С обзиром на бинарну матрицу која садржи само 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 
Recommended Practice Покривеност свих нула у бинарној матрици Покушајте!

А једноставно решење решити овај проблем је бројањем јединица око нула независно, тј. покрећемо петљу четири пута у сваком правцу за сваку ћелију за дату матрицу. Кад год нађемо 1 у било којој петљи, прекидамо петљу и повећавамо резултат за 1.

Ан ефикасно решење је да урадите следеће. 

  1. Пређите све редове с лева на десно резултат повећања ако се 1 већ види (у тренутном обиласку) и тренутни елемент је 0.
  2. Пређите све редове с десна на лево ако се 1 већ види (у тренутном обиласку) и тренутни елемент је 0.
  3. Пређите све колоне од врха до дна ако се 1 већ види (у тренутном обиласку) и тренутни елемент је 0.
  4. Пређите све колоне одоздо према горе резултат повећања ако се 1 већ види (у тренутном обиласку) и тренутни елемент је 0.

У доњем коду се узима Боолеан променљива исОне која постаје истинита чим се наиђе на јединицу у тренутном обиласку за све нуле након што се тај резултат итерације повећа једном истом процедуром која се примењује у сва четири правца да би се добио коначни одговор. Ресетујемо исОне на фалсе након сваког преласка.

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
    <  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>   

Излаз
20 

Временска сложеност: О(н 2
Помоћни простор: О(1)

 

Креирај квиз