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

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

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

给定一个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 xolumn
    // 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
";
    else if (horizontal && !vertical)
        cout << "HORIZONTAL
";
    else if (vertical && !horizontal)
        cout << "VERTICAL
";
    else
        cout << "BOTH
";
}
  
// Driven Program
int main()
{
    int mat[MAX][MAX] = { { 1, 0, 1 },
                          { 0, 0, 0 },
                          { 1, 0, 1 } };
  
    checkHV(mat, 3, 3);
  
    return 0;
}


输出:

BOTH

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

有关详细信息,请参阅有关检查二进制矩阵中的水平和垂直对称性的完整文章!