📜  检查二进制矩阵中的水平和垂直对称性

📅  最后修改于: 2022-05-13 01:57:23.829000             🧑  作者: Mango

检查二进制矩阵中的水平和垂直对称性

给定一个NM列的二维二进制矩阵。任务是检查矩阵是水平对称、垂直对称还是两者兼而有之。如果第一行与最后一行相同,则称该矩阵是水平对称的,第二行与倒数第二行相同,依此类推。如果第一列与最后一列相同,则称该矩阵是垂直对称的,第二列与倒数第二列相同,依此类推。如果矩阵是垂直对称的,则打印“VERTICAL”,如果矩阵是垂直对称的,则打印“HORIZONTAL”,如果矩阵是垂直和水平对称的,则打印“BOTH”,如果不是对称的,则打印“NO”。

例子:

Input: N = 3 M = 3
0 1 0
0 0 0
0 1 0
Output: Both
First and third row are same and also second row 
is in middle. So Horizontal Symmetric.
Similarly, First and third column are same and
also second column is in middle, so Vertical 
Symmetric.

Input:
0 0 1
1 1 0
0 0 1.
Output: Both 

这个想法是使用指示两行(或列)的指针并比较两个指向的行(或列)的每个单元格。
对于水平对称,初始化一个指针 i = 0 和另一个指针 j = N – 1。
现在,比较第 i 行和第 j 行的每个元素。在每个循环周期中将 i 增加 1 并将 j 减少 1。如果找到至少一个不相同的元素,则将该矩阵标记为非水平对称。
同样,对于垂直对称,初始化一个指针 i = 0 和另一个指针 j = M – 1。
现在,比较第 i 列和第 j 列的每个元素。在每个循环周期中将 i 增加 1 并将 j 减少 1。如果找到至少一个不同的元素,则将矩阵标记为非垂直对称。

下面是上述思想的实现:

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 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]) {
                vertical = false;
                break;
            }
        }
    }
 
    if (!horizontal && !vertical)
        cout << "NO\n";
    else if (horizontal && !vertical)
        cout << "HORIZONTAL\n";
    else if (vertical && !horizontal)
        cout << "VERTICAL\n";
    else
        cout << "BOTH\n";
}
 
// Driven Program
int main()
{
    int mat[MAX][MAX] = { { 1, 0, 1 },
                          { 0, 0, 0 },
                          { 1, 0, 1 } };
 
    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 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)
            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(i < M // 2):
         
        # Checking each cell of a row.
        for j in range(N):
             
            # check if every cell is identical
            if (arr[i][j] != arr[k][j]):
                vertical = False
                break
        i += 1
        k -= 1
         
    if (not horizontal and not vertical):
        print("NO")
    else if (horizontal and not vertical):
        print("HORIZONTAL")
    else if (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 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 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


Javascript


输出:

BOTH

时间复杂度: O(N*M)。