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

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

给定一个由 N 行和 M 列组成的二进制二维矩阵。任务是要检查矩阵是否具有水平对称性、垂直对称性或两者都具备。当第一行与最后一行相同,第二行与倒数第二行相同,依此类推时,该矩阵被认为具有水平对称性。当第一列与最后一列相同,第二列与倒数第二列相同,依此类推时,该矩阵被认为具有垂直对称性。如果矩阵垂直对称,则输出“VERTICAL”,如果矩阵水平对称,则输出“HORIZONTAL”,如果矩阵既具有垂直对称性又具有水平对称性,则输出“BOTH”,如果不对称,则输出“NO”。

举例

输入:N = 3 M = 3
0 1 0
0 0 0
0 1 0
输出:Both
第一行和第三行相同,第二行处于中间。因此具有水平对称性。
类似地,第一列和第三列相同,并且第二列处于中间,因此具有垂直对称性。

输入:
0 0 1
1 1 0
0 0 1.
输出:Both

思路是使用指向两个行(列)的指针,并比较所指向的行(列)的每个单元格。

水平对称: 初始化一个指针i=0,另一个指针j=N-1。

现在,每个循环周期中比较i-th行和j-th行的每个元素。每次将i增加1,j减少1。如果发现至少有一个不相同的元素,则标记矩阵为不具有水平对称性。

类似地,对于垂直对称性,初始化一个指针i=0,另一个指针j=M-1。

现在,比较i-th列和j-th列的每个元素。每次将i增加1,j减少1。如果发现至少有一个不相同的元素,则标记矩阵为不具有垂直对称性。

下面是上述思想的实现:

// C++ program to find if a matrix is symmetric.
#include <bits/stdc++.h>
#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).

辅助空间 : O(1),因为它对变量使用了常量空间。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

C++ 示例