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


假设我们有一个M x N阶的二进制矩阵。任务是检查该矩阵是否水平对称、垂直对称或两者兼有。如果第i行与第(M – i)行相同,则称该矩阵为水平对称;如果第j列与第(N – j)列相同,则称该矩阵为垂直对称。假设输入矩阵如下所示:

011
101
011

这是水平对称的。

111
101
111

这是垂直对称的。

111
101
111

这是水平和垂直对称的。

我们将分两个阶段解决这个问题。首先,我们将检查矩阵是否水平对称,如果是,则设置一个布尔变量horizontal_flag = true,否则为false;如果矩阵垂直对称,则设置vartical_flag = true,否则为false。如果两者都为真,则答案将是完全对称的。

示例

在线演示

#include <iostream>
#define MAX 20
using namespace std;
void checkSymmetryLevel(int arr[][MAX], int N, int M) {
   bool horizontal_flag = true, vartical_flag = true;
   for (int i = 0, k = N - 1; i < N / 2; i++, k--) {
      for (int j = 0; j < M; j++) {
         if (arr[i][j] != arr[k][j]) {
            horizontal_flag = false;
            break;
         }
      }
   }
   for (int i = 0, k = M - 1; i < M / 2; i++, k--) {
      for (int j = 0; j < N; j++) {
         if (arr[i][j] != arr[k][j]) {
            vartical_flag = false;
            break;
         }
      }
   }
   if (!horizontal_flag && !vartical_flag)
      cout << "This is not symmetric from any point of view";
   else if (horizontal_flag && !vartical_flag)
      cout << "This is not horizontally symmetric";
   else if (vartical_flag && !horizontal_flag)
      cout << "This is vertically symmetric";
   else
   cout << "This is symmetric in both direction";
}
int main() {
   int mat[MAX][MAX] = {
   { 1, 1, 1 },
   { 1, 0, 1 },
   { 1, 1, 1 } };
   checkSymmetryLevel(mat, 3, 3);
}

输出

This is symmetric in both direction

更新于:2019年10月22日

212 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告