Как проверить, симметрична ли матрица? - PullRequest
1 голос
/ 15 апреля 2019

Я должен разделить матрицу пополам по вертикали и посмотреть, симметрична ли она. Например, если mat [0] [0] == mat [0] [1] и mat [1] [0] == mat [1] [1], матрица является симметричной. Мне удалось проверить симметрию в матрице 2x2, но я хочу, чтобы функция была доступна в любой матрице, например 4x4 или 3x3.

i и j - переменные, которые я использую для прохождения элементов mat, а n - размерность матрицы. Это функция для матрицы 2х2. Как я могу обобщить это?

 private static void getSymmetry(int mat[][], int i, int j, int n) {
        int index = 0;
        int sum=0;
        if (n == 2) {
            if (mat[i][j] == mat[i][j + 1]) {
                index = index + 1;
            }
            if (mat[i + 1][j] == mat[i + 1][j + 1]) {
                index = index + 1;
            }
            sum = sum + index;
        }
        System.out.println("Degree of symmetry is " + sum);
    }

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Вы можете использовать следующий подход, он проверяет симметричность для всех чисел:

private static boolean isSymmetric(int mat[][]) {
    for(int a = 0; a< mat.length; a++){
        for(int b = 0; b < mat[a].length / 2; b++){
            if(mat[a][b] != mat[a][mat[a].length-b-1]) {
                return false;
            }
        }
    }       
    return true;
}

...

boolean symmetric = isSymmetric(mat);
if(symmetric) {
    System.out.println("symmetric");
} else {
    System.out.println("Not symmetric");
}
0 голосов
/ 15 апреля 2019
public class MatrixSymmetry {

  public static void main(String[] args) {

    int[][] matrix = {
        {1, 1, 1},
        {1, 2, 1},
        {1, 1, 1}
    };

    System.out.println(isSymmetric(matrix));
  }

  public static boolean isSymmetric(int[][] matrix) {

    for (int i = 0; i < matrix.length; i++) {

      // you got the row
      int[] row = matrix[i];
      int end = row.length - 1;

      for (int start = 0; start < end; start++) {
        if (row[start] != row[end]) {
          return false;
        }
        end--;
      }

    }
    return true;
  }

}
0 голосов
/ 15 апреля 2019

Несмотря на то, что предоставленные ответы хороши, вот еще одна попытка с использованием известного метода, называемого Two-Pointers. Я считаю, что это немного более понятно и оптимизировано.

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        int[][] mat = {
            {1, 2, 2, 1},
            {4, 3, 3, 4},
            {2, 3, 3, 2}
        };

        //assume the matrix is square
        int rows = mat.length, columns = mat[0].length;

        boolean symmetric = true;
        for(int r = 0; r < rows && symmetric; r++){
            //now declare two pointers one from left and one from right
            int left = 0, right = columns - 1;

            while (left < right){
                if(mat[r][left] != mat[r][right]){
                    symmetric = false;
                    break;
                }
                right--;
                left++;
            }
        }

        System.out.println(symmetric? "The matrix is symmetric." : "The matrix isn't symmetric.");
    }
}

Вот код Ideone .

...