Total dekning av alle nuller i en binær matrise
#practiceLinkDiv { display: ingen !viktig; } Gitt en binær matrise, det vil si at den inneholder bare 0-er og 1-er, trenger vi å finne summen av dekning av alle nuller i matrisen der dekning for en bestemt 0 er definert som totalt antall enere rundt en null i retning venstre høyre opp og ned. De kan være hvor som helst til hjørnet peker i en retning.
Eksempler:
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 Dekning av alle nuller i en binær matrise Prøv det! EN enkel løsning for å løse dette problemet er å telle enere rundt null uavhengig, dvs. vi kjører sløyfe fire ganger i hver retning for hver celle for den gitte matrisen. Hver gang vi finner en 1 i en løkke bryter vi løkken og øker resultatet med 1.
An effektiv løsning er å følge.
- Gå gjennom alle rader fra venstre til høyre inkrementresultat hvis en 1 allerede er sett (i gjeldende traversering) og gjeldende element er 0.
- Gå gjennom alle rader fra høyre til venstre inkrementresultat hvis en 1 allerede er sett (i gjeldende traversering) og gjeldende element er 0.
- Gå gjennom alle kolonner fra topp til bunn inkrementresultat hvis en 1 allerede er sett (i gjeldende traversering) og gjeldende element er 0.
- Gå gjennom alle kolonner fra bunn til topp resultat hvis en 1 allerede er sett (i gjeldende traversering) og gjeldende element er 0.
I koden nedenfor tas en boolsk variabel isOne som gjøres sann så snart en ener påtreffes i gjeldende traversering for alle nuller etter at iterasjonsresultatet økes med en samme prosedyre brukes i alle fire retninger for å få endelig svar. Vi tilbakestiller isOne til falsk etter hver kryssing.
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>
Produksjon
20
Tidskompleksitet: O(n 2 )
Hjelpeområde: O(1)
Lag quiz