Gegeven een 2D binaire matrix van N rijen en M kolommen. De taak is om te controleren of de matrix horizontaal symmetrisch verticaal symmetrisch is of beide. Er wordt gezegd dat de matrix horizontaal symmetrisch is als de eerste rij hetzelfde is als de laatste rij, de tweede rij hetzelfde is als de voorlaatste rij, enzovoort. En er wordt gezegd dat de matrix verticaal symmetrisch is als de eerste kolom hetzelfde is als de laatste kolom, de tweede kolom hetzelfde is als de voorlaatste kolom, enzovoort.
Afdrukken ' VERTICAAL 'als de matrix verticaal symmetrisch is' HORIZONTAAL 'als de matrix verticaal symmetrisch is' BEIDE ' als de matrix verticaal en horizontaal symmetrisch is en ' NEE 'zo niet symmetrisch.
Voorbeelden:
Invoer: N = 3 M = 3
0 1 0
0 0 0
0 1 0
Uitgang: Beide
Uitleg: De eerste en derde rij zijn hetzelfde en ook de tweede rij bevindt zich in het midden. Dus horizontaal symmetrisch. Op dezelfde manier zijn de eerste en derde kolom hetzelfde en ook de tweede kolom bevindt zich in het midden, dus verticaal symmetrisch.Invoer: N = 3 M = 3
0 0 1
1 1 0
0 0 1
Uitgang: Beide
Benadering: Het idee is om aanwijzers te gebruiken die twee rijen (of kolommen) aangeven en elke cel van beide puntige rijen (of kolommen) te vergelijken.
- Voor horizontale symmetrie initialiseert u één aanwijzer i = 0 en een andere aanwijzer j = N - 1.
- Vergelijk nu elk element van de i-de rij en de j-de rij. Verhoog i met 1 en verlaag j met 1 in elke luscyclus.
- Als er minstens één niet-identiek element wordt gevonden, markeer de matrix dan als niet horizontaal symmetrisch.
- Op dezelfde manier initialiseert u voor verticale symmetrie één aanwijzer i = 0 en een andere aanwijzer j = M - 1.
- Vergelijk nu elk element van de i-de kolom en de j-de kolom. Verhoog i met 1 en verlaag j met 1 in elke luscyclus.
- Als er minstens één niet-identiek element wordt gevonden, markeer de matrix dan als niet verticaal symmetrisch.
Hieronder ziet u de implementatie van het bovenstaande idee:
C++// C++ program to find if a matrix is symmetric. #include #define MAX 1000 using namespace std; void checkHV(int arr[][MAX] int N int M) { // Initializing as both horizontal and vertical // symmetric. bool horizontal = true vertical = true; // Checking for Horizontal Symmetry. We compare // first row with last row second row with second // last row and so on. for (int i = 0 k = N - 1; i < N / 2; i++ k--) { // Checking each cell of a column. for (int j = 0; j < M; j++) { // check if every cell is identical if (arr[i][j] != arr[k][j]) { horizontal = false; break; } } } // Checking for Vertical Symmetry. We compare // first column with last column second column // with second last column and so on. for (int j = 0 k = M - 1; j < M / 2; j++ k--) { // Checking each cell of a row. for (int i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { vertical = false; break; } } } if (!horizontal && !vertical) cout << 'NOn'; else if (horizontal && !vertical) cout << 'HORIZONTALn'; else if (vertical && !horizontal) cout << 'VERTICALn'; else cout << 'BOTHn'; } // Driven Program int main() { int mat[MAX][MAX] = { { 0 1 0 } { 0 0 0 } { 0 1 0 } }; checkHV(mat 3 3); return 0; }
Java // Java program to find if // a matrix is symmetric. import java.io.*; public class GFG { static void checkHV(int[][] arr int N int M) { // Initializing as both horizontal // and vertical symmetric. boolean horizontal = true; boolean vertical = true; // Checking for Horizontal Symmetry. // We compare first row with last // row second row with second // last row and so on. for (int i = 0 k = N - 1; i < N / 2; i++ k--) { // Checking each cell of a column. for (int j = 0; j < M; j++) { // check if every cell is identical if (arr[i][j] != arr[k][j]) { horizontal = false; break; } } } // Checking for Vertical Symmetry. We compare // first column with last column second column // with second last column and so on. for (int j = 0 k = M - 1; j < M / 2; j++ k--) { // Checking each cell of a row. for (int i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { horizontal = false; break; } } } if (!horizontal && !vertical) System.out.println('NO'); else if (horizontal && !vertical) System.out.println('HORIZONTAL'); else if (vertical && !horizontal) System.out.println('VERTICAL'); else System.out.println('BOTH'); } // Driver Code static public void main(String[] args) { int[][] mat = { { 1 0 1 } { 0 0 0 } { 1 0 1 } }; checkHV(mat 3 3); } } // This code is contributed by vt_m.
Python3 # Python3 program to find if a matrix is symmetric. MAX = 1000 def checkHV(arr N M): # Initializing as both horizontal and vertical # symmetric. horizontal = True vertical = True # Checking for Horizontal Symmetry. We compare # first row with last row second row with second # last row and so on. i = 0 k = N - 1 while(i < N // 2): # Checking each cell of a column. for j in range(M): # check if every cell is identical if (arr[i][j] != arr[k][j]): horizontal = False break i += 1 k -= 1 # Checking for Vertical Symmetry. We compare # first column with last column second column # with second last column and so on. i = 0 k = M - 1 while(j < M // 2): # Checking each cell of a row. for i in range(N): # check if every cell is identical if (arr[i][j] != arr[i][k]): vertical = False break j += 1 k -= 1 if (not horizontal and not vertical): print('NO') elif (horizontal and not vertical): print('HORIZONTAL') elif (vertical and not horizontal): print('VERTICAL') else: print('BOTH') # Driver code mat = [[1 0 1] [0 0 0] [1 0 1]] checkHV(mat 3 3) # This code is contributed by shubhamsingh10
C# // C# program to find if // a matrix is symmetric. using System; public class GFG { static void checkHV(int[ ] arr int N int M) { // Initializing as both horizontal // and vertical symmetric. bool horizontal = true; bool vertical = true; // Checking for Horizontal Symmetry. // We compare first row with last // row second row with second // last row and so on. for (int j = 0 k = N - 1; j < N / 2; j++ k--) { // Checking each cell of a column. for (int i = 0; i < M; i++) { // check if every cell is identical if (arr[i j] != arr[i k]) { horizontal = false; break; } } } // Checking for Vertical Symmetry. We compare // first column with last column second column // with second last column and so on. for (int i = 0 k = M - 1; i < M / 2; i++ k--) { // Checking each cell of a row. for (int j = 0; j < N; j++) { // check if every cell is identical if (arr[i j] != arr[k j]) { horizontal = false; break; } } } if (!horizontal && !vertical) Console.WriteLine('NO'); else if (horizontal && !vertical) Console.WriteLine('HORIZONTAL'); else if (vertical && !horizontal) Console.WriteLine('VERTICAL'); else Console.WriteLine('BOTH'); } // Driver Code static public void Main() { int[ ] mat = { { 1 0 1 } { 0 0 0 } { 1 0 1 } }; checkHV(mat 3 3); } } // This code is contributed by vt_m.
PHP // PHP program to find if // a matrix is symmetric. function checkHV($arr $N $M) { // Initializing as both horizontal // and vertical symmetric. $horizontal = true; $vertical = true; // Checking for Horizontal Symmetry. // We compare first row with last row // second row with second last row // and so on. for ($i = 0 $k = $N - 1; $i < $N / 2; $i++ $k--) { // Checking each cell of a column. for ($j = 0; $j < $M; $j++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$k][$j]) { $horizontal = false; break; } } } // Checking for Vertical Symmetry. // We compare first column with // last column second column with // second last column and so on. for ($j = 0 $k = $M - 1; $j < $M / 2; $j++ $k--) { // Checking each cell of a row. for ($i = 0; $i < $N; $i++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$i][$k]) { $horizontal = false; break; } } } if (!$horizontal && !$vertical) echo 'NOn'; else if ($horizontal && !$vertical) cout << 'HORIZONTALn'; else if ($vertical && !$horizontal) echo 'VERTICALn'; else echo 'BOTHn'; } // Driver Code $mat = array(array (1 0 1) array (0 0 0) array (1 0 1)); checkHV($mat 3 3); // This code is contributed by nitin mittal. ?> JavaScript <script> // Javascript program to find if // a matrix is symmetric. function checkHV(arr N M) { // Initializing as both horizontal // and vertical symmetric. let horizontal = true; let vertical = true; // Checking for Horizontal Symmetry. // We compare first row with last // row second row with second // last row and so on. for (let i = 0 k = N - 1; i < parseInt(N / 2 10); i++ k--) { // Checking each cell of a column. for (let j = 0; j < M; j++) { // check if every cell is identical if (arr[i][j] != arr[k][j]) { horizontal = false; break; } } } // Checking for Vertical Symmetry. We compare // first column with last column second column // with second last column and so on. for (let j = 0 k = M - 1; j < parseInt(M / 2 10); j++ k--) { // Checking each cell of a row. for (let i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { horizontal = false; break; } } } if (!horizontal && !vertical) document.write('NO'); else if (horizontal && !vertical) document.write('HORIZONTAL'); else if (vertical && !horizontal) document.write('VERTICAL'); else document.write('BOTH'); } let mat = [ [ 1 0 1 ] [ 0 0 0 ] [ 1 0 1 ] ]; checkHV(mat 3 3); </script>
Uitvoer
BOTH
Tijdcomplexiteit: O(N*M).
Hulpruimte: O(1)