logo

Verifica la simmetria orizzontale e verticale nella matrice binaria

Data una matrice binaria 2D di N righe e M colonne. Il compito è verificare se la matrice è simmetrica orizzontale, simmetrica verticale o entrambe. Una matrice si dice simmetrica orizzontale se la prima riga è uguale all'ultima riga, la seconda riga è uguale alla penultima riga e così via. E la matrice si dice simmetrica verticale se la prima colonna è uguale all'ultima colonna, la seconda colonna è uguale alla penultima colonna e così via.

gimp come deselezionare

Stampa ' VERTICALE ' se la matrice è verticalmente simmetrica ' ORIZZONTALE ' se la matrice è verticalmente simmetrica ' ENTRAMBI ' se la matrice è simmetrica verticale e orizzontale e ' NO ' se non simmetrico.

Esempi:   



Ingresso: N = 3 M = 3
0 1 0
0 0 0
0 1 0
Produzione: Entrambi
Spiegazione: La prima e la terza fila sono uguali e anche la seconda fila è al centro. Quindi simmetrico orizzontale. Allo stesso modo la prima e la terza colonna sono le stesse e anche la seconda colonna è al centro, quindi simmetrica verticale.

Ingresso: N = 3 M = 3
0 0 1
1 1 0
0 0 1
Produzione: Entrambi 

Approccio: L'idea è di utilizzare puntatori che indicano due righe (o colonne) e confrontare ciascuna cella di entrambe le righe (o colonne) puntate. 

programma Python per la ricerca binaria
  • Per la simmetria orizzontale inizializzare un puntatore i = 0 e un altro puntatore j = N - 1. 
  • Ora confronta ciascun elemento della i-esima riga e della j-esima riga. Aumenta i di 1 e diminuisci j di 1 in ogni ciclo del ciclo. 
    • Se viene trovato almeno un elemento non identico, contrassegnare la matrice come non simmetrica orizzontale.
  • Allo stesso modo per la simmetria verticale inizializzare un puntatore i = 0 e un altro puntatore j = M - 1. 
  • Ora confronta ciascun elemento della i-esima colonna e della j-esima colonna. Aumenta i di 1 e diminuisci j di 1 in ogni ciclo del ciclo. 
    • Se viene trovato almeno un elemento non identico, contrassegnare la matrice come non simmetrica verticale.

Di seguito è riportata l'implementazione dell'idea di cui sopra: 

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> 

Produzione
BOTH

Complessità temporale: O(N*M).
Spazio ausiliario: O(1)


java come eseguire l'override
Crea quiz